1.树的中序遍历非递归
思路使用stack替换掉递归(第一种写法 )
第一种写法是
while(两个条件)
while(条件一)
if(条件二)
1 . while(两种情况)
- 直走到树的最左边结点,把左边的结点全部压入stack,
- 走完左边的结点后,出stack, 继判断是否最左边的结点是否有右结点
== 如果有右结点,则对这个子树执行(1)中同样的操作,回到步骤一==
2.出stack的同时访问结点
代码(Java)
// Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x; }
}
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result =new ArrayList<>();
if(root==null) return result;
Stack<TreeNode> tmp = new Stack<>();
TreeNode p = root;
//p是遍历指针,如果一直有最左边结点,一直遍历; 第二种情况是如果没有最左边结点,就要访问stack中的结点
while(p!=null || !tmp.isEmpty()) {
//两种情况
//第一种情况,来到最左边的结点,最左边的结点肯定是没有左孩子结点
while (p != null) {
tmp.add(p);
p = p.left;
}
//判断最左边的结点是否有右结点,继续按照上面的步骤遍历遍历到其最左边的结点
if (!tmp.isEmpty()) {
//遍历最左边的结点
TreeNode t = tmp.pop();
result.add(t.val);
if (t.right != null)
p = t.right;
}
}
return result;
}
}
c++
class