剑指Offer07:重建二叉树

问题:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例:

给出
前序遍历 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
        }
    }
}

思路:本题采用递归的思想。找出根结点以及左右节点,然后再找出左节点的根结点以及它的左右节点,找出右节点的根结点以及它的左右节点,依次重复。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值