剑指offer-重建二叉树

Posted moonbeautiful

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-重建二叉树相关的知识,希望对你有一定的参考价值。

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 
 

 

概念:

前序遍历:父节点->左子树->右子树

中序遍历:左子树->父节点->右子树

分析:

前序遍历数组:[1,2,3,4,5,6,7]

中序遍历数组:[3,2,4,1,6,5,7]

前序遍历从父节点开始,所以1是根节点;而中序遍历的顺序是  左子树-> 1 ->右子树,所以在中序遍历数组中,1左边是左子树,1右边是右子树。

[3,2,4] 是左子树,[6,5,7]是右子树;

以左子树为例,再看前序遍历数字下一个节点是2,所以2是左子树的父节点,2左边是左子树,即[3],2右边是右子树,即[4]。

所以 大问题分解为小问题,最后一棵树为一个节点,直接创建。

 

注意点:

1、当只有左子树或者右子树时,左边界可能大于右边界。

 

 

 

 

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     private int pos = 0;
12     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
13         if(pre.length == 0){
14             return null;
15         }
16         return buildTree(pre,in,0,pre.length -1);
17     }
18     
19     public TreeNode buildTree(int [] pre,int [] in,int l,int r){
20         //只有左子树或只有右子树时,会产生左边界比右边界大的情况
21         if(l>r){
22             return null;
23         }
24         //只有一个节点时,创建并返回
25         if(l==r){
26             TreeNode node = new TreeNode(pre[pos]);
27             pos++;
28             return node;
29         }
30         //创建当前节点
31         TreeNode cur = new TreeNode(pre[pos]);
32         //在中序遍历数组中找到当前节点的位置
33         int i=l;
34         for(;i<=r;i++){
35             if(in[i]==pre[pos]){
36                 break;
37             }        
38         }
39         //找到相应节点后,前序遍历数组变量位置才加+
40         pos++;
41         //分别创建当前节点的左右子节点
42         cur.left = buildTree(pre,in,l,i-1);
43         cur.right = buildTree(pre,in,i+1,r);
44         return cur;
45     }
46 }

 

以上是关于剑指offer-重建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer重建二叉树python

剑指offer重建二叉树

《剑指offer》— JavaScript重建二叉树

剑指 Offer 07. 重建二叉树(java解题)

剑指Offer07 重建二叉树

重建二叉树-剑指Offer