剑指offer个人刷题历程记录

剑指offer—重建二叉树

题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
1.首先需要了解二叉树的结构,根据前序遍历和中序遍历找出根节点。
前序遍历:首先第一个节点是根节点,其次访问左子树和右子树。
中序遍历:根据前序遍历,找到左子树和右子树。
2.使用递归,不断地遍历左子树,右子树。
注意点:
开始使用java语言,一直看python导致书写格式经常犯错。

具体代码:
1.这个是看懂但是运行出来不对的

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        int pLen=pre.length;
        int iLen=in.length;
        if(pLen==0&&iLen==0){
            return null;
        }
        return  btConstruct(pre,in,0,pLen-1,0,iLen-1);
    }

//构建方法,pStart和pEnd分别是前序遍历序列数组的第一个元素和最后一个元素
//iStart和iEnd分别是中序遍历序列数组的第一个元素和最后一个元素
    public TreeNode btConstruct(int[] pre,int [] in,int pStart,int pEnd,int iStart,int iEnd)
    {
        //建立根节点
        TreeNode tree=new TreeNode(pre[pStart]);
        tree.left=null;
        tree.right=null;
        if(pStart==pEnd && iStart==iEnd)
        {
            return tree;
        }
        int root=0;
        //找中序遍历中的根节点
       for(root=iStart; root<iEnd;root++)
       {
           if(pre[pStart]==root)
           {
               break;
           }
       }
        int leftlength=root-iStart;
        int rightlength=iEnd-root;
        //遍历左子树
        if(leftlength>0)
        {
            tree.left=btConstruct(pre,in,pStart+1,pStart+leftlength, iStart, root-1);
        }
        //遍历右子树
        if(rightlength>0)
        {
            tree.right=btConstruct(pre,in,pStart+leftlength+1,pEnd,root+1,iEnd);
        }
        return tree;
    }
}

2.大神写的代码

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) {
        val = x;
        }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
          TreeNode root=reConstructBTree(pre,0,pre.length-1,in,0,in.length-1);
          return root;
     }
      private TreeNode reConstructBTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) {
               
            if(startPre>endPre||startIn>endIn)
                return null;
            TreeNode root=new TreeNode(pre[startPre]);
            for(int i=startIn;i<=endIn;i++)
                if(in[i]==pre[startPre]){
                    root.left=reConstructBTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                    root.right=reConstructBTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
                }
                       
            return root;
        }
}

总结
一开始的思路就不对,数据结构的算法都忘记了,需要重新拾起。能力太弱了,需要努力。
已知前序和中序遍历,可以确定一棵二叉树。已知中序和后序遍历,可以确定一棵二叉树。但是,已知前序和后序遍历,不能确定一棵二叉树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值