新手算法学习之路----二叉树

题目:给出一棵二叉树,返回其节点值的前序遍历。(非递归实现)

思路:从根节点开始找,先访问根节点,将该节点压如栈中,然后指向该节点的左孩子,在判断这个左孩子是否为空,如果不为空那么继续访问该节点并将其压如栈中,并指向该左孩子的左孩子,继续判断是否为空;如果他的左孩子为空那么弹出栈定元素,进行出栈,然后根据弹出来的元素来判断右孩子是否为空,如果右孩子也为空就继续弹出栈顶元素,;算法终止的条件是指针为空且栈也为空。

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;        
    }

 

posted @ 2017-07-11 16:12  JunLiu37  阅读(165)  评论(0编辑  收藏  举报