1. 程式人生 > >Java二叉樹的前序、中序、後序遍歷

Java二叉樹的前序、中序、後序遍歷

相信一直關注平時業務程式碼的同學都很少關注二叉樹、堆、棧等資料結構的訪問和遍歷。

今天我們就說說二叉樹的遍歷

什麼是前序遍歷?什麼是中序遍歷?什麼是後序遍歷?這個不懂的先自行百度一下吧。

二叉樹和連結串列的區別是,連結串列只有後序節點,二叉樹雖然沒有next節點,但是有左節點和右節點。

所以我們先定義二叉樹的節點。

程式碼如下:

public class NodeWD<T> {
    private T value;//節點值
    private  NodeWD<T> leftNode; //左節點
    private  NodeWD<T> rightNode;//右節點
    public NodeWD(){
    }
    public NodeWD(T value,NodeWD<T> leftNode,NodeWD<T> rightNode){
        this.value=value;
        this.leftNode=leftNode;
        this.rightNode=rightNode;
    }
    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public NodeWD<T> getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(NodeWD<T> leftNode) {
        this.leftNode = leftNode;
    }

    public NodeWD<T> getRightNode() {
        return rightNode;
    }

    public void setRightNode(NodeWD<T> rightNode) {
        this.rightNode = rightNode;
    }
}

接下來是遍歷

public class BinaryTree<T> {  
    public void printNode(NodeWD<T> T){
        System.out.print(T.getValue().toString());
    }
    //先序遍歷
    public  void  firstTraversal(NodeWD<T> root){
        if(root!=null){  printNode(root); }

        if(root.getLeftNode()!=null){
            firstTraversal(root.getLeftNode());
        }
        if(root.getRightNode()!=null){
            firstTraversal(root.getRightNode());
        }
    }

    public void  orderTraversal(NodeWD<T> root){
        if(root.getLeftNode()!=null){
            orderTraversal(root.getLeftNode());
        }printNode(root);
        if(root.getRightNode()!=null){
            orderTraversal(root.getRightNode());
        }
    }
    public  void  lastTraversal(NodeWD<T> root){
      if(root.getLeftNode()!=null){
          lastTraversal((root.getLeftNode()));
      }
      if(root.getRightNode()!=null){
          lastTraversal(root.getRightNode());
      }
        printNode(root);

    }
}

呼叫程式碼:

   public static void main(String[] args) {

        
         //注意必須逆序建立,先建立子節點,再逆序往上建立,
            // 因為非葉子結點會使用到下面的節點,而初始化是按順序初始化的,不逆序建立會報錯
            NodeWD<Integer> J=new NodeWD<>(8,null,null);
            NodeWD<Integer> H=new NodeWD<>(4,null,null);
            NodeWD<Integer> G=new NodeWD<>(2,null,null);
            NodeWD<Integer> F=new NodeWD<>(7,J,null);
            NodeWD<Integer> E=new NodeWD<>(5,H,null);
            NodeWD<Integer> D=new NodeWD<>(1,null,G);
            NodeWD<Integer> C=new NodeWD<>(9,F,null);
            NodeWD<Integer> B=new NodeWD<>(3,D,E);
            NodeWD<Integer> A=new NodeWD<>(6,B,C);

        BinaryTree<Integer> binaryTree=new BinaryTree<>();
        binaryTree.firstTraversal(A);
        System.out.println("*******************");
        binaryTree.orderTraversal(A);
        System.out.println("*******************");
        binaryTree.lastTraversal(A);
    }

打印出的結果:

631254978
*******************
123456879
*******************
214538796