二叉樹中序遍歷非遞歸-Java版

先序和層次遍歷在這裏

思路:

只用一個額外結點p。

構造一個棧,將根節點入棧。

每次循環做如下事情;

p來控制左孩子一直入棧,直到沒有左孩子,這時p在最左邊的結點。

這時如果p有右孩子,就將p指向p的右孩子,並將右孩子入棧。

如果沒有的話p置空就行(不然的話,p還是在最左邊的結點,下次循環會重新循環p)

 

import java.util.Stack;
class TreeNode{
    TreeNode left = null;
    TreeNode right = null;
    public int data = 0;
    TreeNode(int data){
        this.data = data;
    }
}
public class InOrder {
    
    public static void main(String[] args){
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        TreeNode t4 = new TreeNode(4);
        TreeNode t5 = new TreeNode(5);
        TreeNode t6 = new TreeNode(6);
        t1.left = t2;
        t2.left = t3;
        t2.right = t4;
        t4.left = t5;
        t5.right = t6;
        inOrder(t1);


    }
    public static void inOrder(TreeNode root){
        if(root == null){
            return ;
        }
        Stack<TreeNode> s = new Stack<TreeNode>();
        TreeNode p = root;
        s.add(p);   //這裏直接add(p) 不是root。
        while( !s.empty()){
            if(p != null && p.left != null){
                s.add(p.left);   //這裏add的不是p而是p.left
                p = p.left;
            }else{              //else不能少,不然每次都彈出去一個元素
                p = s.pop();
                System.out.println(p.data);
                if(p.right != null){
                    s.add(p.right);
                    p = p.right;
                }else{
                    p = null;  //p已經被訪問過了,置空,下次不訪問。
                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章