赞
踩
在递归遍历的时候要掌握三个要素。
以下是代码部分:(以前序遍历为例,中序遍历和后序遍历只要调整一下中节点的处理顺序就可以了)
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); preOreder(root,list); return list; } public void preOreder(TreeNode t, List<Integer> list){ if(t == null) return; list.add(t.val); preOreder(t.left , list); preOreder(t.right, list); }
//前序遍历 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); TreeNode it = root; //树为空([]),这里也会将空节点压栈 stack.push(it); while (!stack.isEmpty()){ //指针指向栈顶元素,并弹出栈顶元素, it = stack.pop(); //判断当前节点是否为空 if(it == null) continue; //并将val值放进数组 list.add(it.val); //先放右子树 stack.push(it.right); stack.push(it.left); } return list; }
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); if (root == null){ return result; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (!stack.isEmpty()){ TreeNode node = stack.pop(); result.add(node.val); if (node.left != null){ stack.push(node.left); } if (node.right != null){ stack.push(node.right); } } Collections.reverse(result); return result; }
//中序遍历 public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); TreeNode it = root; while ( it!=null || !stack.isEmpty()){ if(it!=null){ stack.push(it); it = it.left; }else{ it = stack.pop(); list.add(it.val); it = it.right; } } return list; }
将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。
要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法。
以下是代码部分(前序遍历):
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); Stack<TreeNode> s = new Stack<>(); TreeNode cur = root; //压入根节点 if(cur!=null) s.push(cur); while (!s.isEmpty()){ //判断栈顶元素是否为空,若为空,证明要处理该节点 if(s.peek()!=null){ /** * 使用栈来实现递归,可以认为栈顶元素就是一个指针,指向下一个要处理的节点 */ //先将栈中的元素弹出,并将值赋给cur cur = s.pop(); //再依据反向的顺序将要遍历的节点入栈 if(cur.right!=null) s.push(cur.right); //右 if(cur.left!=null) s.push(cur.left); //左 s.push(cur); //中 s.push(null); } //处理节点 else { //先弹出栈顶的空节点元素 s.pop(); res.add(s.pop().val); } } return res; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。