重建二叉树
2017-04-09 14:06
288 查看
二叉树的存储结构:
主要采用链式存储结构,顺序存储结构仅适用于完全二叉树(满二叉树)。
将完全二叉树的结点按次序进行编号,实际上是对完全二叉树的一次层次遍历。
完全二叉树能够采用顺序存储结构存储,依靠数组元素的相邻位置反映完全二叉树的逻辑结构。所以,完全二叉树能够采用顺序储存结构存储,依靠元素的相邻位置反映完全二叉树的逻辑结构。
由于顺序存储结构没有特别的存储元素间的关系,不存在一棵二叉树与一种线性序列是一对一的映射,所以,非完全二叉树不能采用顺序存储结构存储。
二叉树的链式存储结构主要有二叉链表和三叉链表。(区别是:三叉链表增加了一个地址域parent指向其父母结点。)
构造一棵二叉树必须明确以下两种关系:
1.结点与其父母结点及孩子结点之间的层次关系;
2.兄弟结点之间左或右的次序关系。
三种能够唯一确定一棵二叉树的表示法:
由于先根次序或后根次序反映父母与孩子结点的层次关系,中根次序反映兄弟结点间的左右次序。
1.已知先根和中根两种遍历序列;
2.已知中根和后根两种遍历序列;
3.标明空子树的先根序列表示。
问题分析
已知先序遍历序列和中序遍历序列,根据两个遍历序列重建二叉树。
结题思路:
一、先遍历先序序列,第一个值即为树的根结点;遍历中序序列(假设没有重复的元素)与先序序列中的第一个值相同的值即为根结点,剩下的元素即为左子树和右子树的元素;
(第一步找到了根结点与左右子树。)
二、遍历先序序列中除了根结点(紧跟根结点)的元素,第一个元素即为左子树的根结点,元素数量与之前遍历中序序列的找出的左子树数量一样。。。。
三、这是个递归过程。详细内容还得慢慢领悟》看代码。
主要采用链式存储结构,顺序存储结构仅适用于完全二叉树(满二叉树)。
将完全二叉树的结点按次序进行编号,实际上是对完全二叉树的一次层次遍历。
完全二叉树能够采用顺序存储结构存储,依靠数组元素的相邻位置反映完全二叉树的逻辑结构。所以,完全二叉树能够采用顺序储存结构存储,依靠元素的相邻位置反映完全二叉树的逻辑结构。
由于顺序存储结构没有特别的存储元素间的关系,不存在一棵二叉树与一种线性序列是一对一的映射,所以,非完全二叉树不能采用顺序存储结构存储。
二叉树的链式存储结构主要有二叉链表和三叉链表。(区别是:三叉链表增加了一个地址域parent指向其父母结点。)
构造一棵二叉树必须明确以下两种关系:
1.结点与其父母结点及孩子结点之间的层次关系;
2.兄弟结点之间左或右的次序关系。
三种能够唯一确定一棵二叉树的表示法:
由于先根次序或后根次序反映父母与孩子结点的层次关系,中根次序反映兄弟结点间的左右次序。
1.已知先根和中根两种遍历序列;
2.已知中根和后根两种遍历序列;
3.标明空子树的先根序列表示。
问题分析
已知先序遍历序列和中序遍历序列,根据两个遍历序列重建二叉树。
结题思路:
一、先遍历先序序列,第一个值即为树的根结点;遍历中序序列(假设没有重复的元素)与先序序列中的第一个值相同的值即为根结点,剩下的元素即为左子树和右子树的元素;
(第一步找到了根结点与左右子树。)
二、遍历先序序列中除了根结点(紧跟根结点)的元素,第一个元素即为左子树的根结点,元素数量与之前遍历中序序列的找出的左子树数量一样。。。。
三、这是个递归过程。详细内容还得慢慢领悟》看代码。
//重建二叉树 public class Solution8 { //Definition for binary tree public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public static TreeNode reConstructBinaryTree(int[] pre, int[] in) { return build(pre,in,0,pre.length-1,0,in.length-1); } public static TreeNode build(int[] pre, int[] in, int pstart, int pend, int istart, int iend){ //递归过程 //传入参数:先序遍历序列数组、中序遍历序列数组、先序遍历开始位置、先序遍历结束位置、中开始、中结束 if(pstart>pend) return null; //判断有效 int cur = pre[pstart];//根节点,先序遍历数组开始位置即为根结点 int find = istart; while(find<=iend){//在中序遍历中查找根节点 if(cur==in[find]) break; else find++; } int len = find-istart; TreeNode res = new TreeNode(cur);//创建根节点 //System.out.println(res+" "); res.left = build(pre,in,pstart+1,pstart+len,istart,find-1);//创建左子树 res.right = build(pre,in,pstart+len+1,pend,find+1,iend);//创建右子树 return res; } public static void main(String args[]){ int[] pre = {1,2,4,7,3,5,6,8}; int[] in = {4,7,2,1,5,3,8,6}; //reConstructBinaryTree(pre,in); } }
相关文章推荐
- 剑指offer-面试题6-重建二叉树
- 《剑指offer》面试题6:重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 【二叉树】由前序遍历和中序遍历重建二叉树
- 剑指:由前序遍历和中序遍历重建二叉树
- 重建二叉树
- 二叉树的遍历以及重建(Python实现)
- 重建二叉树
- poj2255(二叉树重建)
- 剑指offer之重建二叉树
- 根据前序和中序序列重建二叉树
- 由前序遍历和中序遍历重建二叉树
- 剑指offer编程题——06 重建二叉树
- 重建二叉树
- nyist oj 756 重建二叉树
- 重建二叉树
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- 重建二叉树(Java)