Java 构造二叉树如此简单
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 构造二叉树如此简单相关的知识,希望对你有一定的参考价值。
一、由中序和后序遍历构造二叉树
1. 题目
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
2. 题目分析
可以借助二叉树后序遍历最后一个值为根节点的值,以此为分界线可以将中序遍历数组分为两部分
以此为基础,层层切割
切割过程中会产生区间,为了方便处理,需要统一设置,左闭右闭的区间 []
使用后序的最后一个值划分中序,再依据中序划分出来的两个区间的长度对后序进行划分
3. 代码
class Solution
public TreeNode buildTree(int[] inorder, int[] postorder)
if (inorder.length == 0 || postorder.length == 0)
return null;
//采用左闭右闭的规则
return createBinaryTree(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
public TreeNode createBinaryTree(int[] in, int inBegin, int inEnd, int[] post, int postBegin, int postEnd)
if (inBegin > inEnd || postBegin > postEnd)
return null;
TreeNode root = new TreeNode(post[postEnd]);
for (int i = inBegin; i <= inEnd; i++)
//下标 i 表示中序数组中根节点的下标
if (in[i] == root.val)
//数组区间均是左闭右闭 [begin,end]
root.left = createBinaryTree(in, inBegin, i - 1, post, postBegin, postBegin + i - 1 - inBegin);
root.right = createBinaryTree(in, i + 1, inEnd, post, postBegin + i - inBegin, postEnd - 1);
break;
return root;
二、由前序和中序遍历构造二叉树
该题思路和上面这道题相同
只是,这里由前序的第一个元素我根节点,划分中序集合
class Solution
public TreeNode buildTree(int[] preorder, int[] inorder)
if (preorder.length == 0 || inorder.length == 0)
return null;
return createTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
public TreeNode createTree(int[] pre, int preBegin, int preEnd, int[] in, int inBegin, int inEnd)
if (preBegin > preEnd || inBegin > inEnd)
return null;
TreeNode root = new TreeNode(pre[preBegin]);
for (int i = inBegin; i <= inEnd; i++)
if (in[i] == root.val)
root.left = createTree(pre, preBegin + 1, preBegin + i - inBegin, in, inBegin, i - 1);
root.right = createTree(pre, preBegin + 1 + i - inBegin, preEnd, in, i + 1, inEnd);
break;
return root;
三、总结
创建二叉树,思路类似,都是依据前序首位元素或者后序的末尾元素,来划分中序集合
划分过程,注意区间的长度大小,定义开闭区间需要统一,这里统一定义左闭右闭
比如:
root.left = createTree(pre, preBegin + 1, preBegin + i - inBegin, in, inBegin, i - 1);
已知中序集合的区间为[inBegin,i-1]
,所以可以确定前序的左半区间长度也为:i-1-inBegin
已知,前序的首位preBegin
为根元素,所以左半区间其实元素下标为 preBegin+1
,又知长度为 i-1-inBegin
,所以前序集合左半区间为[preBegin+1,preBegin+1+i-1-inBegin]
技巧:此时正好
i-1-inBegin = preBegin+1+i-1-inBegin - (preBegin+1)
以上是关于Java 构造二叉树如此简单的主要内容,如果未能解决你的问题,请参考以下文章
(二叉树)原来Java 求解二叉树的最大深度如此简单 !!!
构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果