1. 程式人生 > >java——二叉樹的四種遍歷方式

java——二叉樹的四種遍歷方式

按從左到右的思維習慣主要有四種:

前、中、後序遍歷主要看你把根節點放在什麼時候遍歷,放在第一個遍歷然後依次遍歷左子樹、右子樹(前序遍歷),先遍歷左子樹、遍歷完了再來遍歷根節點、然後遍歷右子樹,把根節點的遍歷放中間就是(中序遍歷),把根節點放最後遍歷的就是後序遍歷。

1、前序遍歷:
若二叉樹為空,則返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹;

在這裡插入圖片描述
2、中序遍歷
若二叉樹為空,則返回,否則從根節點開始(注意並不是先訪問根節點),然後中序遍歷左子樹,再中序遍歷右子樹;
在這裡插入圖片描述

3、後序遍歷
若二叉樹為空,則返回,否則從左到右先葉子後節點的方式遍歷訪問左右子樹,最後訪問根節點;
在這裡插入圖片描述
4、層序遍歷
若二叉樹為空,則返回,否則從樹的第一層開始(也就是根節點),從上到下逐層遍歷,同一層從左到右逐個遍歷;


在這裡插入圖片描述

二叉樹遍歷的性質:
1、已知前序和中序遍歷序列,可以唯一確定一顆二叉樹;
2、已知後序和中序遍歷序列,可以唯一確定一顆二叉樹;

但是:已知前序和後序遍歷序列,是不能確定一顆二叉樹的因為你可以確定根節點但是無法確定左右子樹;

引用的方法(二叉樹、佇列):

    /**
     * 遍歷二叉樹,先序遍歷
     * @param node
     */
    public void DLR(Node node) {
        if(node != null) {
            node_data(node);
            DLR(node.left);
            DLR(node.right);
        }
    }

    /**
     * 遍歷二叉樹,中序遍歷
     * @param node
     */
    public void LDR(Node node) {
        if(node != null) {
            LDR(node.left);
            node_data(node);
            LDR(node.right);
        }
    }


    /**
     * 遍歷二叉樹 後序遍歷
     * @param node
     */
    public void LRD(Node node) {
        if(node != null) {
            LRD(node.left);
            LRD(node.right);
            node_data(node);
        }
    }

    /**
     * 二叉樹的遍歷,層序遍歷
     * @param node
     * @param MaxLength
     */
    public void Level(Node node,int MaxLength) {
        Node p = null;
        Node[] q = new Node[MaxLength];  //定義一個佇列
        int head = 0,tail = 0;
        if(node != null) {
            tail = (tail+1)%MaxLength;   //隊尾指標
            q[tail] = node;
        }
        while(head != tail) {
            head = (head+1)%MaxLength;
            p = q[head];
            node_data(p);
            if(p.left != null) {
                tail = (tail+1)%MaxLength;
                q[tail] = p.left;
            }

            if(p.right != null) {
                tail = (tail+1)%MaxLength;
                q[tail] = p.right;
            }

        }
    }