二叉树遍历

来源:互联网 发布:ubuntu卸载samba 编辑:程序博客网 时间:2024/06/11 12:32

用递归和非递归实现二叉树遍历

1.非递归先序遍历

    访问顺序:中-左-右
    具体过程:①申请一个栈stack,初始化时,将头结点压入堆栈;
                      ②从栈中弹出头结点,如果头结点的右孩子不为空,那么将右孩子压入栈;如果左孩子不为空,将左孩子压入栈;
                      ③重复上面②的操作,直到堆栈为空,此时结束遍历   
public void preOrder(TreeNode tr){      Stack stack=new Stack();      stack.push(tr);      while(!stack.isEmpty){           TreeNode head=stack.pop();           if(head.right!=null) stack.push(head.right);           if(head.left!=null) stack.push(head.left);           System.out.println(head);       }}


2.非递归中序遍历

      访问顺序:左-中-右
      具体过程:①申请一个栈stack,空结点cur,初始化时,将根结点赋值给cur结点并且该结点压入堆栈
                        ②如果cur结点的左孩子不为空,那么将左孩子压入堆栈,并且更新当前节点为cur结点;如果cur结点为空,弹出堆栈中头结点,打印出头节点,并且将cur结点赋值为头结点的右孩子。
                        ③反复执行②,直到整个堆栈为空,并且cur指针为空时,循环结束
public void inOrder(TreeNode tr){   Stack stack=new Stack();   TreeNode cur=tr;   while(!stack.isEmpty() || cur!=null){       if(cur!=null){           stack.push(cur);           cur=cur.left;       }else{           TreeNode node=stack.pop();           System.out.println(node.val);           cur=node.right;       }   }}

3.非递归后序遍历

    访问顺序:左-右-中
    双栈法
    具体过程:①申请两个堆栈,stack1,stack2,初始化时,将根结点推入堆栈stack1
                      ②弹出堆栈stack1头结点,如果左孩子不为空,将其推入堆栈stack1,如果右孩子不为空,将其推入堆栈stack1,将头结点推入stack2.
                      ③直至stack1,为空,结束遍历,然后打印stack2中的元素
public void postOrder(TreeNode tn){    Stack st1=new Stack();    st1.push(tn);    Stack st2=new Stack();    while(!st1.isEmpty()){        TreeNode t=st1.pop();        if(t.left!=null) st1.push(t.left);        if(t.right!=null) st2.push(t.right);        st2.push(t);    }   while(!st2.isEmpty()){      System.out.print(st2.pop().val);   }}



原创粉丝点击