您的位置:首页 > 理论基础 > 数据结构算法

数据结构-重建二叉树

2014-05-04 13:29 381 查看
#include <iostream>

using namespace std;

struct BinaryTreeNode{
int data;
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
};

BinaryTreeNode* Rebuilt(int *pre,int* preEnd,int* in,int* inEnd){
BinaryTreeNode* root = new BinaryTreeNode;
root->data = pre[0];
root->lchild = root->rchild = NULL;

if(pre == preEnd){    //循环结束条件
return root;
}

int* curP = in;
while(*curP != pre[0] && in < inEnd){   //寻找中序和先序相同的节点
curP++;
}

int LchildSize = curP - in;
int* LchildEnd = pre + LchildSize ;

if(LchildSize > 0){
root->lchild = Rebuilt(pre+1,pre+LchildSize,in,curP-1);     //控制左节点范围进行递归
}

if((preEnd - pre) > LchildSize){
root->rchild = Rebuilt(pre+LchildSize+1,preEnd,curP+1,inEnd);
}

return root;
}

BinaryTreeNode* Start(int* pre,int* in,int size){
if(pre == NULL || in == NULL){
return NULL;
}

return Rebuilt(pre,pre+size-1,in,in+size-1);   //控制左右子节点的范围
}

void PreOrder(BinaryTreeNode* root){
if(root != NULL){
cout << root->data << " ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}

void InOrder(BinaryTreeNode* root){
if(root != NULL){
InOrder(root->lchild);
cout << root->data << " ";
InOrder(root->rchild);
}
}

void PostOrder(BinaryTreeNode* root){
if(root != NULL){
PostOrder(root->lchild);
PostOrder(root->rchild);
cout << root->data << " ";
}
}

int main()
{
int Pre[] = {1,2,4,7,3,5,6,8};
int In[] = {4,7,2,1,5,3,8,6};
int Size = sizeof(Pre)/sizeof(int);   //获取长度,以便得到尾指针

BinaryTreeNode *root = Start(Pre,In,Size);

cout << "先序遍历: " ;
PreOrder(root);
cout << endl;
cout << "中序遍历: " ;
InOrder(root);
cout << endl;
cout << "后序遍历: " ;
PostOrder(root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: