二叉树递归定义 :
1) 空节点(null)为二叉树
2)二叉树的左子树为二叉树,二叉树的右子树为二叉树。
二叉树的前序遍历递归定义 :
1) 当前节点为空(null)直接返回
2) 对于非空节点
i) 操作当前节点
ii) 前序遍历左子树
iii) 前序遍历右子树
二叉树的非递归遍历方法 :
使用栈来进行遍历。
策略简述 :
利用栈和循环,每次循环的输入变量node都必须为当前要遍历的树的根节点。也就是将循环当作递归函数使用。
例如当前输入node = root,那么对于当前层面来说,下一次 node = root.left。当左子树前序遍历结束后,必定要是 node = root.right。
那么如何实现上述例子呢?
1 class Solution { 2 public List<Integer> preorderTraversal(TreeNode root) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Stack<TreeNode> stack = new Stack<TreeNode>(); 5 while (root != null || !stack.isEmpty()) { 6 if (root != null){ 7 res.add(root.val); 8 stack.push(root.right); 9 root = root.left; 10 }else { 11 root = stack.pop(); 12 } 13 }return res; 14 } 15 }
代码解释 :
第五行是边界条件 : 什么时候结束遍历? 当当前节点为空节点且栈也为null时。
循环的输入参数 : root, stack。
什么时候左子树遍历完毕,要遍历上一层的树根节点的右子树? 当当前节点指针为空的时候。也就意味着左子树遍历完毕了。