算法总结之 二叉树的非递归遍历

用递归解决的问题都能用非递归解决

这是因为无非就是利用函数栈来保存信息,如果自己申请的数据结构来代替栈,也可以实现相同功能。

实现非递归的先序遍历:

1 申请一个栈 stack  

2 然后将头节点head压入stack

3 从stack中弹出栈顶节点 cur, 打印cur的节点值。 再将cur的右孩子压入stack, 最后将cur的左孩子压入stack

重复 直到stack为空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package TT;
 
import java.util.Stack;
 
public class Test117 {
    public class Node{
           public int value;
           public Node left;
           public Node right;
            
           public Node(int data){
               this.value=data;
           }
       }
     
    public void  preOrderUnrecur(Node head){
         
        if(head !=null){
             
            Stack<Node> stack=new Stack<Node>();
            stack.add(head);
            while( !stack.isEmpty()){
                head=stack.pop();
                System.out.println(head.value+"");
                if(head.right !=null){
                    stack.push(head.right);
                }
                if(head.left != null){
                    stack.push(head.left);
                }
            }
     
        }  
        System.out.println();
    }
 
}

 非递归中序遍历

1 申请一个新的栈 stack  初始cur=head

2 把cur节点压入栈中 对以cur节点为头的整棵子树来说, 依次把左边界压入栈中,即不停的令 cur=cur.left  重复

3 不断重复步骤2 直到发现cur为null 此时从stack中弹出一个节点,记为node  打印node 的值  并且让cur=node.right  重复步骤2

4 当stack为null 且cur为null时, 整个过程停止

复制代码
package TT;

import java.util.Stack;

public class Test118 {
    public class Node{
           public int value;
           public Node left;
           public Node right;
           
           public Node(int data){
               this.value=data;
           }
       }
    
public void inOrderUnRecur(Node head){
     
      if(head !=null){
          
          Stack<Node> stack = new Stack<Node>();
          while(!stack.isEmpty() || head!=null){
              
               if(head !=null){
                   stack.push(head);
                   head=head.left;
               }else {
                head=stack.pop();
                System.out.println(head.value+"");
                head=head.right;
            }
              
          }
          
          
          System.out.println();
      }
    
    
}    
    
}
复制代码

非递归实现后序遍历   有两种方法 本博客介绍一种

两个栈实现后序遍历过程

1 申请两个栈 s1 s2   然后将头节点压入s1

2从s1中弹出的节点记为cur 然后将cur的左孩子和右孩子压入s1中

3 在整个过程中 每一个从s1弹出的节点都放进s2中

4不断重复2 和 3 直到s1为空 停止

从s2 中一次弹出节点并打印 打印的顺序就是后续遍历的顺序

复制代码
package TT;

import java.util.Stack;

public class Test119 {

    public class Node{
           public int value;
           public Node left;
           public Node right;
           
           public Node(int data){
               this.value=data;
           }
       }
    
    public void posOrderUnRecur1(Node head){
        
        if(head !=null){
            Stack<Node> s1 = new Stack<Node>();
            Stack<Node> s2 = new Stack<Node>();
            s1.push(head);
            while(!s1.isEmpty()){
                head=s1.pop();
                s2.push(head);
                if(head.left != null){
                    s1.push(head.left);
                }
                if(head.right != null){
                    s1.push(head.right);
                }
            }
            while(!s2.isEmpty()){
                System.out.println(s2.pop().value+" ");
            }
        }
        
        System.out.println();
        
    }
    
    
    
}
复制代码

 

  

 

posted @   toov5  阅读(290)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示