服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 一篇文章教你如何用多种迭代写法实现二叉树遍历

一篇文章教你如何用多种迭代写法实现二叉树遍历

2021-11-02 13:31保护眼睛 Java教程

这篇文章主要介绍了C语言实现二叉树遍历的迭代算法,包括二叉树的中序遍历、先序遍历及后序遍历等,是非常经典的算法,需要的朋友可以参考下

思想

利用栈和队列都可以实现树的迭代遍历。递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的、无非就是插入值的时机不一样。利用栈的先进先出的特点,对于前序遍历、我们可以先将当前的值放进结果集中,表示的是根节点的值、然后将当前的节点加入到栈中、当前的节点等于自己的left、再次循环的时候、也会将left作为新的节点、直到节点为空、也就是走到了树的最左边、然后回退、也就是弹栈、、也可以认为回退的过程是从低向上的、具体就是让当前的节点等于栈弹出的right、继续重复上面的过程,也就实现了树的前序遍历、也就是bfs.后续遍历、中序遍历思想也是类似的。

实现

?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
public List<Integer> preorderTraversal1(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    while (!stack.isEmpty() || root != null) {
        while (root != null) {
            res.add(root.val);
            stack.add(root);
            root = root.left;
        }
        TreeNode cur = stack.pop();
        root = cur.right;
    }
    return res;
}
public List<Integer> preorderTraversal2(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    while (!stack.isEmpty() || root != null) {
        if (root != null) {
            res.add(root.val);
            stack.add(root);
            root = root.left;
        } else {
            TreeNode cur = stack.pop();
            root = cur.right;
        }
    }
    return res;
}
public List<Integer> preorderTraversal3(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    if (root == null) return res;
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode cur = stack.pop();
        res.add(cur.val);
        if (cur.right != null) {
            stack.push(cur.right);
        }
        if (cur.left != null) {
            stack.push(cur.left);
        }
    }
    return res;
}
public List<Integer> preorderTraversal4(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    if (root == null) {
        return res;
    }
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        root = queue.poll();
        res.add(root.val);
        if (root.right != null) {
            queue.addFirst(root.right);
        }
        if (root.left != null) {
            root = root.left;
            while (root != null) {
                res.add(root.val);
                if (root.right != null) {
                    queue.addFirst(root.right);
                }
                root = root.left;
            }
        }
    }
    return res;
}
public List<Integer> inorderTraversal1(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    while (root != null || !stack.isEmpty()) {
        if (root != null) {
            stack.add(root);
            root = root.left;
        } else {
            TreeNode cur = stack.pop();
            res.add(cur.val);
            root = cur.right;
        }
    }
    return res;
}
public List<Integer> inorderTraversal2(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    while (root != null || !stack.isEmpty()) {
        while (root != null) {
            stack.add(root);
            root = root.left;
        }
        TreeNode cur = stack.pop();
        res.add(cur.val);
        root = cur.right;
    }
    return res;
}
public List<Integer> postorderTraversal1(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    if (root == null) return res;
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode cur = stack.pop();
        res.add(cur.val);
        if (cur.left != null) {
            stack.push(cur.left);
        }
        if (cur.right != null) {
            stack.push(cur.right);
        }
    }
    Collections.reverse(res);
    return res;
}
public List<Integer> postorderTraversal2(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    while (!stack.isEmpty()) {
        while (root != null) {
            res.add(root.val);
            stack.push(root);
            root = root.right;
        }
        TreeNode cur = stack.pop();
        root = cur.left;
    }
    Collections.reverse(res);
    return res;
}
public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> ret = new ArrayList<>();
    if(root == null)return ret;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()){
        int size = queue.size();
        List<Integer> list = new ArrayList<>();
        while(size!=0){
            TreeNode cur = queue.poll();
            list.add(cur.val);
            if(cur.left!=null){
                queue.offer(cur.left);
            }
            if(cur.right!= null){
                queue.offer(cur.right);
            }
            size --;
        }
        ret.add(list);
    }
    return ret;
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/qq_45859087/article/details/119141358

延伸 · 阅读

精彩推荐
  • Java教程浅析Java中的set集合类型及其接口的用法

    浅析Java中的set集合类型及其接口的用法

    Java本身对set集合提供了一个接口,一般的实现类是HastSet和 TreeSet,这里我们先来简要浅析Java中的set集合类型及其接口的用法: ...

    kuiwu-wang3562020-05-03
  • Java教程简单总结SpringMVC拦截器的使用方法

    简单总结SpringMVC拦截器的使用方法

    今天给大家带来的是关于SpringMVC拦截器的相关知识,文章围绕着SpringMVC拦截器的使用方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下...

    红旗下的小兵4672021-09-17
  • Java教程SpringCloud Config使用本地仓库及map注入

    SpringCloud Config使用本地仓库及map注入

    这篇文章主要介绍了SpringCloud Config使用本地仓库及map注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    一马平川15502020-09-10
  • Java教程MyEclipse设置Console输出到文件的实现方法

    MyEclipse设置Console输出到文件的实现方法

    下面小编就为大家带来一篇MyEclipse设置Console输出到文件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网2562020-12-03
  • Java教程Java SE实现多人聊天室功能

    Java SE实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java SE实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    L_X_Y_HH4862021-07-01
  • Java教程java将数据写入内存,磁盘的方法

    java将数据写入内存,磁盘的方法

    下面小编就为大家分享一篇java将数据写入内存,磁盘的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Chris-Green5692021-03-23
  • Java教程Java基础教程之接口的继承与抽象类

    Java基础教程之接口的继承与抽象类

    这篇文章主要介绍了Java基础教程之接口的继承与抽象类,本文介绍了接口继承、接口的多重继承以及抽象类的知识,需要的朋友可以参考下 ...

    junjie2882019-11-27
  • Java教程java排序去重示例分享

    java排序去重示例分享

    这篇文章主要介绍了java排序去重示例,对String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"计算出现个数,排序去重,需要的朋友可以参考下 ...

    java技术网3012019-11-08