新手算法学习之路----二叉树
题目:给出一棵二叉树,返回其节点值的前序遍历。(非递归实现)
思路:从根节点开始找,先访问根节点,将该节点压如栈中,然后指向该节点的左孩子,在判断这个左孩子是否为空,如果不为空那么继续访问该节点并将其压如栈中,并指向该左孩子的左孩子,继续判断是否为空;如果他的左孩子为空那么弹出栈定元素,进行出栈,然后根据弹出来的元素来判断右孩子是否为空,如果右孩子也为空就继续弹出栈顶元素,;算法终止的条件是指针为空且栈也为空。
Java代码:
public ArrayList<Integer> preorderTraversal(TreeNode root) { // write your code here ArrayList<Integer> Result = new ArrayList<Integer>(); if(root == null) return Result; Stack<TreeNode> s = new Stack<TreeNode>(); while(root!=null||!s.empty()){ //程序结束的标志 if(root!=null){ //判断节点是否为空 Result.add(root.val); s.push(root); //将root这个节点入栈 root = root.left; //指向节点的左子树 }else{ root = s.pop(); //这里的pop的作用是取回该子节点的父节点,待下一步找右节点用 root = root.right; //这里的root是上一步if语句块里面的root,而不是root = Result.left后的root节点 } } return Result; }