树遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoucs86/article/details/87997965
public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();

    Stack<TreeNode> stack = new Stack<TreeNode>();
    TreeNode cur = root;

    while(cur!=null || !stack.empty()){
        while(cur!=null){
            stack.add(cur);
            cur = cur.left;
        }
        cur = stack.pop();
        list.add(cur.val);
        cur = cur.right;
    }

    return list;
}

左边有就左边入栈,左边没有就pop出来,自己加入list,递归右边的

先往左走到最底,利用stack慢慢把堆里面的节点抛出来处理,内层的while中处理左节点,内层的非while抛出右边节点处理

一个广度优先的方案

class Solution {
     public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> wrapList = new LinkedList<List<Integer>>();
            levelMaker(wrapList, root, 0);
            return wrapList;
        }
        
        public void levelMaker(List<List<Integer>> list, TreeNode root, int level) {
            if(root == null) return;
            if(level >= list.size()) {
                list.add(0, new LinkedList<Integer>());
            }
            levelMaker(list, root.left, level+1);
            levelMaker(list, root.right, level+1);
            list.get(list.size()-level-1).add(root.val);
        }
}

猜你喜欢

转载自blog.csdn.net/zhoucs86/article/details/87997965