二叉树重建
2014-07-14 10:45
267 查看
一、已知先序遍历和中序遍历,求后序遍历。
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=944
根据先序遍历和中序遍历还原二叉树的主要思想:
1、先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点。
2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道先序遍历中左子树以及右子树的起止位置。
3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。
实现代码:
二、已知中序遍历和后序遍历,求先序遍历。
http://acm.nyist.net/JudgeOnline/problem.php?pid=756
根据中序遍历和后序遍历还原二叉树的主要思想:
1、后序遍历序列的最后一个元素必定是根节点,可以由此获取二叉树的根节点。
2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道后序遍历中左子树以及右子树的起止位置。
3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。
实现代码:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=944
根据先序遍历和中序遍历还原二叉树的主要思想:
1、先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点。
2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道先序遍历中左子树以及右子树的起止位置。
3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。
实现代码:
#include<cstdio> #include<cstring> #include<cstdlib> struct Node { char value; Node *left, *right; }; Node *build_new_node(char ch) { Node *p = (Node*)malloc(sizeof(Node)); p->value = ch; p->left = p->right = NULL; return p; } Node *Rebuild(char *pre, char *in, int n) { if(n == 0) return NULL; char ch = pre[0]; Node *p = build_new_node(ch); int i; for(i = 0; i < n && in[i] != ch; i++); int l_len = i; int r_len = n - i - 1; if(l_len > 0) p->left = Rebuild(pre+1, in, l_len); if(r_len > 0) p->right = Rebuild(pre+l_len+1, in+l_len+1, r_len); return p; } void PostOrder(Node *p) { if(p == NULL) return ; PostOrder(p->left); PostOrder(p->right); printf("%c",p->value); } int main() { char PreOrder[100], inOrder[100]; while(~scanf("%s%s",PreOrder, inOrder)) { Node *root = Rebuild(PreOrder,inOrder,strlen(PreOrder)); PostOrder(root); printf("\n"); } return 0; }
二、已知中序遍历和后序遍历,求先序遍历。
http://acm.nyist.net/JudgeOnline/problem.php?pid=756
根据中序遍历和后序遍历还原二叉树的主要思想:
1、后序遍历序列的最后一个元素必定是根节点,可以由此获取二叉树的根节点。
2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道后序遍历中左子树以及右子树的起止位置。
3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。
实现代码:
#include<cstdio> #include<cstring> #include<cstdlib> struct Node { char value; Node *left, *right; }; Node *build_new_node(char ch) { Node *p = (Node*)malloc(sizeof(Node)); p->value = ch; p->left = p->right = NULL; return p; } Node *Rebuild(char *post, char *in, int n) { if(n == 0) return NULL; char ch = post[n-1]; Node *p = build_new_node(ch); int i; for(i = 0; i < n && in[i] != ch; i++); int l_len = i; int r_len = n - i - 1; if(l_len > 0) p->left = Rebuild(post, in, l_len); if(r_len > 0) p->right = Rebuild(post + l_len, in+l_len+1, r_len); return p; } void PreOrder(Node *p) { if(p == NULL) return ; printf("%c",p->value); PreOrder(p->left); PreOrder(p->right); } int main() { char PostOrder[100], InOrder[100]; while(~scanf("%s%s",PostOrder, InOrder)) { Node *root = Rebuild(PostOrder,InOrder,strlen(PostOrder)); PreOrder(root); printf("\n"); } return 0; }
相关文章推荐
- 已知前序遍历和中序遍历重建二叉树
- 剑指offer-重建二叉树 由前序和中序遍历序列建树
- 给出前序与中序 序列 重建二叉树
- 重建二叉树(C++递归实现)
- 《编程之美》3.9重建二叉树
- 根据先序和中序重建二叉树
- [面试备忘]计算字符串相似度 & 无头单链删非头尾节点 & 基于前续中续重建二叉树
- 重建二叉树(剑指offer)
- nyoj756(重建二叉树)
- 重建二叉树
- 重建二叉树以及树的遍历
- 重建二叉树
- Construct Binary Tree from Inorder and Postorder Traversal 中序和后序重建二叉树
- 重建二叉树
- 《剑指Offer》学习笔记——重建二叉树
- 剑指offer 面试题6—重建二叉树
- 2016/11/10 1001. 二叉树重建
- 剑指offer 重建二叉树
- 题目1385:重建二叉树
- 面试题6:重建二叉树