#include<iostream>
typedef struct TreeNode{
int data;
TreeNode* lchild;
TreeNode* rchild;
int ltag;
int rtag;
}TreeNode,*Bi_TreadTree;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)new TreeNode();
newNode->data = data;
newNode->lchild = NULL;
newNode->rchild = NULL;
newNode->ltag = 0;
newNode->rtag = 0;
return newNode;
}
//层次建树
Bi_TreadTree createTree(int data[],int size) {
Bi_TreadTree root;
TreeNode** queue = (TreeNode**)new TreeNode*[size];
int rear = 0;
int front = 0;
TreeNode* parent = createNode(data[0]);
root = parent;//记录树根,最后返回
queue[rear++] = parent;
for (int i = 1; i < size; i++)
{
parent = queue[front];
TreeNode* newNode = createNode(data[i]);
if (parent->lchild == NULL)
{
parent->lchild = newNode;
}
else if (parent->rchild == NULL) {
parent->rchild = newNode;
front++;
}
queue[rear++] = newNode;
}
free(queue);
return root;
}
//二叉树的中序线索化
void inOrderThreadedTree(TreeNode* p, TreeNode* &pre) {
if (p != NULL) {
inOrderThreadedTree(p->lchild, pre);
if (p->lchild == NULL) {
p->lchild = pre;
p->ltag = 1;
}
if (pre!=NULL && pre->rchild == NULL) {
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
inOrderThreadedTree(p->rchild, pre);
}
}
void preOrder(Bi_TreadTree t) {
if (t != nullptr) {
printf("%d ", t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
void inOrder(Bi_TreadTree t) {
if (t != nullptr) {
inOrder(t->lchild);
printf("%d ", t->data);
inOrder(t->rchild);
}
}
void postOrder(Bi_TreadTree t) {
if (t != nullptr) {
postOrder(t->lchild);
postOrder(t->rchild);
printf("%d ", t->data);
}
}
int main() {
int data[7] = { 1,2,3,4,5,6,7 };
int size = sizeof(data) / sizeof(data[0]);
Bi_TreadTree t = createTree(data, size);
inOrder(t);
TreeNode* pre = NULL;
inOrderThreadedTree(t,pre);
pre->rchild = NULL;
pre->rtag = 1;
}
二叉树的层次建树和中序线索化
最新推荐文章于 2024-06-25 17:00:08 发布