104. Maximum Depth of Binary Tree

題目Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

分析
1,可以根據(jù)二叉樹的定義來求解書的最大深度
                      0, root == null
 maxDepth(root) =     1+max(maxDepth(root.left),maxDepth(root.right))
2,可以采用層次遍歷, 有多少層,就是二叉樹的深度
3,可以利用二叉樹后序非遞歸遍歷的性質(zhì),棧中保存的是當(dāng)前節(jié)點(diǎn)的所有祖先節(jié)點(diǎn)(他的這些節(jié)點(diǎn)都
是未訪問過的).
所以當(dāng)我們遇到葉子節(jié)點(diǎn)的時(shí)候,棧中保存的就是該葉子節(jié)點(diǎn)到根節(jié)點(diǎn)的所有節(jié)點(diǎn),那么該葉子的深度
就是棧中元素的個(gè)數(shù)
1,遞歸
遞歸式
                     0, root == null
 maxDepth(root) =     1+max(maxDepth(root.left),maxDepth(root.right))

public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
2,利用層次遍歷
 public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        
        List<TreeNode> curLevelNodes = new ArrayList<TreeNode>();
        curLevelNodes.add(root);
        int level = 0;
        while(!curLevelNodes.isEmpty()){
            List<TreeNode> nextLevelNodes = new ArrayList<TreeNode>();
            for(TreeNode node : curLevelNodes){
                if(node.left != null){
                    nextLevelNodes.add(node.left);
                }
                
                if(node.right != null){
                    nextLevelNodes.add(node.right);
                }
            }
            level++;
            curLevelNodes = nextLevelNodes;
        }
        return level;
    }

3,利用后序遍歷棧中元素的性質(zhì)

public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode node = root;
        TreeNode tempNode = null;
        boolean visited = false;
        int height = 0;
        do{
            while(node != null ){
                stack.push(node);
                node = node.left;
            }
            
            tempNode = null;
            visited = true;
            while(!stack.empty() && visited){
                node = stack.peek();
                if(node.right == tempNode){
                    //葉子節(jié)點(diǎn)
                    if(node.left == null && node.right == null){
                        height = height > stack.size() ? height : stack.size();
                    }
                    tempNode = node;
                    stack.pop();
                }else{
                    node = node.right;
                    visited = false;
                }
            }
        }while(!stack.empty());
        return height;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容