二叉樹遍歷

問題:根據先序遍歷和中序遍歷,求解后序遍歷

思路:

  • 第一步,將先序和中序字符串進行劃分。
    先序:1--247--3568中序:472--1--5386,由此可見,數字247屬于左邊的樹結點,數字3568屬于右邊的樹結點,1屬于根結點
  • 第二步,根據第一步的規律,進行遞歸賦值。頂點作為根結點。分別設置其左右結點,如果沒有則為Null。
  • PS:substring方法傳入的第一個參數不能大于字符串長度或者為負數。并且當參數相同時,返回的字符串長度為0。
二叉樹.png

代碼實現:


public class N06 {

    public static void main(String[] args) {
        String preOrder = "12473568";
        String inOrder = "47215386";
        BinaryTree binaryTree = new BinaryTree(preOrder, inOrder);
        TreeNode root = binaryTree.root;
        
        System.out.println("pre order: ");
        binaryTree.preTreeTraverse(root);
        System.out.println();
        
        System.out.println("in order: ");
        binaryTree.inTreeTraverse(root);
        System.out.println();
        
        System.out.println("post order: ");
        binaryTree.postTreeTreverse(root);
        System.out.println();
    }

}

class BinaryTree {
    TreeNode root;

    public BinaryTree(String preOrder, String inOrder) {
        if (preOrder.length() == 0)
            return;
        char key = preOrder.charAt(0);
        int index = inOrder.indexOf(key);
        root = new TreeNode(key);

        this.root.setLeftNode(new BinaryTree(preOrder.substring(1, index + 1), inOrder.substring(0, index)).root);
        this.root.setRightNode(new BinaryTree(preOrder.substring(index + 1),inOrder.substring(index+1)).root);

    }

    public void preTreeTraverse(TreeNode root) {
        //先序遍歷
        if (root != null) {
            System.out.print(root.data+"  ");
            preTreeTraverse(root.leftNode);
            preTreeTraverse(root.rightNode);

        }
    }

    public void inTreeTraverse(TreeNode root) {
        //中序遍歷
        if (root != null) {
            inTreeTraverse(root.leftNode);
            System.out.print(root.data+"  ");
            inTreeTraverse(root.rightNode);
        }
    }

    public void postTreeTreverse(TreeNode root) {
        //后序遍歷
        if (root != null) {
            postTreeTreverse(root.leftNode);
            postTreeTreverse(root.rightNode);
            System.out.print(root.getData()+"  ");
        }
        
    }
}

class TreeNode {
    char data;
    TreeNode leftNode;
    TreeNode rightNode;

    public TreeNode(char data) {
        this.data = data;
    }

    public char getData() {
        return data;
    }

    public void setData(char data) {
        this.data = data;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public TreeNode getRightNode() {
        return rightNode;
    }

    public void setRightNode(TreeNode rightNode) {
        this.rightNode = rightNode;
    }
}

參考

根據先序遍歷與中序遍歷構建二叉樹

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容