1. 程式人生 > >劍指offer個人刷題歷程記錄

劍指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;
        }
}

總結
一開始的思路就不對,資料結構的演算法都忘記了,需要重新拾起。能力太弱了,需要努力。
已知前序和中序遍歷,可以確定一棵二叉樹。已知中序和後序遍歷,可以確定一棵二叉樹。但是,已知前序和後序遍歷,不能確定一棵二叉樹。