1. 程式人生 > >二叉樹的建立(前序中序建立二叉樹、中序後序建立二叉樹)

二叉樹的建立(前序中序建立二叉樹、中序後序建立二叉樹)

前序中序建立二叉樹:
preOrder:{1,2,4,7,3,5,6,8}
inOrder:{4,7,2,1,5,3,8,6}

  • 找到中序中和先序相同的節點(i=3)、leftLen=i、rightLen=len-leftLen-1;
  • 將先序和中序分為兩半,遞迴呼叫:(preS+1,inS,leftLen,preorder,inorder) 和 (preS+leften+1,ins+leftlen+1,rightlen.preorder,inorder)

遞迴實現:

public static TreeNode createTree(int preS,int inS,int
length,int[]preorder,int[]inorder){ if (preorder == null || preorder.length ==0){ return null; } TreeNode node = new TreeNode(preorder[preS]); if(length ==1 && preorder[preS] == inorder[inS]) return node; int i = 0; //找到分界點
while (i <=length-1 && preorder[preS]!= inorder[inS+i]) i++; //左半邊長度 int leftLen = i; //右半邊長度 int rightLen = length-leftLen-1; if(leftLen>=1){ node.left=createTree(preS+1,inS,leftLen,preorder,inorder); } if
(rightLen>=1){ node.right=createTree(preS+leftLen+1,inS+leftLen+1,rightLen,preorder,inorder); } return node; }

中序後序建立二叉樹:
inOrder:{4,7,2,1,5,3,8,6}
postOrder={7,4,2,5,8,6,3,1}

  • 找到中序中和後序相同的節點(i=3);
  • 將中和後序分為兩半,遞迴呼叫:(inS,postE-rightLen-1,leftLen,inorder,postorder)、createTree(inS+leftLen+1,postE-1,rightLen,inorder,postorder)

遞迴實現:

public  TreeNode createTree(int inS,int postE,int length,int[]inorder,int[]postorder){
        if (inorder == null || inorder.length ==0){
            return null;
        }
        TreeNode node = new TreeNode(postorder[postE]);
        if(length ==1 && inorder[inS] == postorder[postE])
            return node;
        int i = 0;
        //找到分界點
        while (i <=length-1 && postorder[postE]!= inorder[inS+i])
            i++;
        //左半邊長度
        int leftLen = i;
        //右半邊長度
        int rightLen = length-leftLen-1;
        if(leftLen>=1){
            node.left=createTree(inS,postE-rightLen-1,leftLen,inorder,postorder);
        }
        if(rightLen>=1){
            node.right=createTree(inS+leftLen+1,postE-1,rightLen,inorder,postorder);
        }
        return node;
    }