根据后序和中序遍历重建二叉树
2013-09-04 01:18
585 查看
思路:
与已知前序遍历的区别在于后序序列要从后向前的顺序建立。
因为前序遍历根节点在其所有子树的前面,而后序遍历的根节点在其所有字数的后面。关键在每次读取两个数组的范围问题:
1) in的边界比较好确定:
有左子树时为[start2,i-1];
有右子树时为[i+1,end2]
2) aft的边界要根据in确定:
有左子树时根据aft和i求出左子树节点个数为:i-start2。所以pre的边界就要包括跳过前(end2-i)个右子树节点, 即:从start1到end1-1-(end2-i)此时综合in的边界为[start1,end1-1-(end2-i),start2,i-1];
有右子树时也要根据aft和i求出左子树节点个数:i-start2。pre的边界就包括前(end2-i)个节点, 即:从end1-(end2-i)到end1-1,此时综合in的边界为[end1-(end2-i),end1-1,i+1,end2]。
总之:在左子树时一定要跨过前面属于右子树的节点,即使没有右子树(此时end2-i等于0)。
代码如下:
aft为后续遍历数组,in为中序遍历数组,start和end为每次递归两个数组的起始与终止下标
与已知前序遍历的区别在于后序序列要从后向前的顺序建立。
因为前序遍历根节点在其所有子树的前面,而后序遍历的根节点在其所有字数的后面。关键在每次读取两个数组的范围问题:
1) in的边界比较好确定:
有左子树时为[start2,i-1];
有右子树时为[i+1,end2]
2) aft的边界要根据in确定:
有左子树时根据aft和i求出左子树节点个数为:i-start2。所以pre的边界就要包括跳过前(end2-i)个右子树节点, 即:从start1到end1-1-(end2-i)此时综合in的边界为[start1,end1-1-(end2-i),start2,i-1];
有右子树时也要根据aft和i求出左子树节点个数:i-start2。pre的边界就包括前(end2-i)个节点, 即:从end1-(end2-i)到end1-1,此时综合in的边界为[end1-(end2-i),end1-1,i+1,end2]。
总之:在左子树时一定要跨过前面属于右子树的节点,即使没有右子树(此时end2-i等于0)。
代码如下:
aft为后续遍历数组,in为中序遍历数组,start和end为每次递归两个数组的起始与终止下标
BinaryTreeNode* ReBuild(int* aft,int*in,int start1,int end1,int start2,int end2) { if((end1-start1)==0) assert (aft[start1]==in[start2]); if(end2<start2) return NULL; BinaryTreeNode* Temp_Node=new BinaryTreeNode(); Temp_Node->m_nValue=aft[end1]; Temp_Node->m_pLeft=NULL; Temp_Node->m_pRight=NULL; for(int i=start2;i<=end2 && in[i]!=aft[end1];i++) ; assert(i<=end2); if (i>start2) Temp_Node->m_pLeft=ReBuild(aft,in,start1,end1-1-(end2-i),start2,i-1); if(i<end2) Temp_Node->m_pRight=ReBuild(aft,in,end1-(end2-i),end1-1,i+1,end2); return Temp_Node; }
相关文章推荐
- 根据后序和中序遍历重建二叉树
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 七:重建二叉树(根据先序遍历(或者后序遍历)和中序遍历重建二叉树)
- 刷题之路----根据前序遍历和中序遍历或者后序遍历和中序遍历重建二叉树
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 二叉树根据先序遍历和中序遍历,得到后序遍历
- LeetCode(Construct Binary Tree from Preorder and Inorder Traversal )根据二叉树的中序遍历和后序遍历重建二叉树
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- 如何根据前序遍历和中序遍历重建二叉树
- 七:重建二叉树(依据先序遍历(或者后序遍历)和中序遍历重建二叉树)
- 剑指offer刷题之c++实现的根据二叉树的前序和中序遍历重建二叉树
- 根据中序遍历和后序遍历重建二叉树
- 根据前序遍历和中序遍历重建二叉树
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
- [leetcode]_根据二叉树的先序遍历(后序遍历) + 中序遍历 重建二叉树
- 根据二叉树的先序遍历和中序遍历重建二叉树
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 根据前序遍历序列和中序遍历序列重建二叉树
- 根据二叉树的先序和中序遍历重建二叉树