问题:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例:
给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
解答:
/**
* Definition for a binary tree node.
* class TreeNode(var _value: Int) {
* var value: Int = _value
* var left: TreeNode = null
* var right: TreeNode = null
* }
*/
object Solution {
def buildTree(preorder: Array[Int], inorder: Array[Int]): TreeNode = {
if (preorder == null || preorder.length == 0) {
return null;
}
var tree = new TreeNode()
tree.value = preorder(0)
if(preorder.length == 1){
return tree
}else{
for(i <- 0 until inorder.length){
if(inorder(i) == preorder(0)){
tree.left = buildTree(preorder,1,i,inorder,0,i-1)
tree.right = buildTree(preorder,1+i,preorder.length-1,inorder,i+1,inorder.length-1)
}
}
return tree
}
}
def buildTree(preorder: Array[Int],p_start: Int,p_end: Int,inorder:Array[Int],i_start: Int,i_end: Int):TreeNode = {
if(p_start > p_end ){
return null
}
var tree = new TreeNode()
tree.value = preorder(p_start)
if(p_start == p_end){
return tree
}else{
var j = 0 //计数
for(i <- i_start to i_end){
if(inorder(i) == preorder(p_start)){
tree.left = buildTree(preorder,p_start+1,p_start+j,inorder,i_start,i-1)
tree.right = buildTree(preorder,p_start+1+j,p_end,inorder,i+1,i_end)
}
j = j+1
}
return tree
}
}
}
思路:本题采用递归的思想。找出根结点以及左右节点,然后再找出左节点的根结点以及它的左右节点,找出右节点的根结点以及它的左右节点,依次重复。。。。。。。