您的位置:首页 > 其它

二叉树- 遍历& 重建

2017-12-17 13:49 218 查看
给定后序遍历和中序遍历求其后序遍历

注意点

数组的初始化

建树过程中

btn *root = new btn;//new 一定不能忘!


左子树右子树的建立一定要注意边界条件

if(i >= 1)
root->left = Build_Tree(io_S, io_S + i - 1, po_S, po_S + i - 1);
//右子树的中序从io_S + i + 1 到 io_T,后序从po_S + i + 1 到 po_T
if(i + 1 + io_S <= io_T)
root->right = Build_Tree(io_S + i + 1, io_T, po_S + i, po_T - 1);


节点的数据结构

struct btn
{
int data;
btn *left;
btn *right;
};


递归建树的过程

btn *Build_Tree(int io_S, int io_T, int po_S, int po_T)
{
int iolen = io_T - io_S + 1;//计算中根序列的长度
btn *root = new btn;//新建一个节点作为根节点
root->data = PostOrder[po_T];//把根节点的数据域指向后根序列的最后一个元素的值
root->left = NULL;
root->right = NULL;//先把根节点的左右节点指针初始化为空
//在中跟序列中找到根节点的位置
int i = 0;
for(i = 0; i < iolen; ++i)
{
if(InOrder[io_S + i] == root->data)
break;
}
//于是左子树的中序从io_S到io_S + i -1,后序从po_S到po_S + i - 1
if(i >= 1) root->left = Build_Tree(io_S, io_S + i - 1, po_S, po_S + i - 1); //右子树的中序从io_S + i + 1 到 io_T,后序从po_S + i + 1 到 po_T if(i + 1 + io_S <= io_T) root->right = Build_Tree(io_S + i + 1, io_T, po_S + i, po_T - 1);
return root;
}


输出

void preOrder(btn *root)
{
if(root != NULL)
{
cout <<root->data<<' ';
preOrder(root->left);
preOrder(root->right);
}
}


树的删除(采用后序遍历)

void delete_tree(btn *root)
{
if(root != NULL)
{
delete_tree(root->left);
delete_tree(root->right);
delete root;
root = NULL;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树
相关文章推荐