剑指Offer二叉树的深度

package Tree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树的深度
 * 输入一棵二叉树,求该树的深度。
 * 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
 */
public class Solution13 {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        Solution13 solution13 = new Solution13();
        TreeNode treeNode = solution13.createBinaryTreeByArray(array, 0);
        System.out.println(solution13.TreeDepth_2(treeNode));
    }

    /**
     * 非递归,层次遍历
     *
     * @param root
     * @return
     */
    public int TreeDepth_2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int start = 0;
        int end = 1;
        int depth = 0;
        while (!queue.isEmpty()) {
            TreeNode temp = queue.poll();
            start++;
            if (temp.left != null) {
                queue.offer(temp.left);
            }
            if (temp.right != null) {
                queue.offer(temp.right);
            }
            if (start == end) {
                start = 0;
                end = queue.size();
                depth++;
            }
        }
        return depth;
    }

    /**
     * 递归
     *
     * @param root
     * @return
     */
    public int TreeDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(TreeDepth(root.left) + 1, TreeDepth(root.right) + 1);
    }

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;
        }

    }

    public TreeNode createBinaryTreeByArray(int[] array, int index) {
        TreeNode tn = null;
        if (index < array.length) {
            int value = array[index];
            tn = new TreeNode(value);
            tn.left = createBinaryTreeByArray(array, 2 * index + 1);
            tn.right = createBinaryTreeByArray(array, 2 * index + 2);
            return tn;
        }
        return tn;
    }
}

原文地址:https://www.cnblogs.com/wupeixuan/p/8623237.html

时间: 2024-10-02 22:19:20

剑指Offer二叉树的深度的相关文章

剑指Offer——二叉树的深度

1.题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2.代码实现 public int TreeDepth(TreeNode root) { if (root == null) { return 0; } int left_len = TreeDepth(root.left); int right_len = TreeDepth(root.right); return Math.max(left_len, rig

acwing 70-72 剑指OFFER 二叉树相关

地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www.acwing.com/problem/content/submission/68/ 三道题都是二叉树相关 使用递归遍历即可解决 70. 二叉搜索树的第k个结点 给定一棵二叉搜索树,请找出其中的第k小的结点. 你可以假设树和k都存在,并且1≤k≤树的总结点数. 输入 输入:root = [2, 1,

剑指offer--45.二叉树的深度

时间限制:1秒 空间限制:32768K 热度指数:139716 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution {

剑指offer——二叉树镜像

操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 代码如下: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ imp

剑指offer 二叉树的下一个结点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 1)如果一个节点有右子树,那么它的下一个结点就是它的右子树中的最左子节点: 2)如果一个节点没有右子树,并且它还是它父节点的右子节点,我们可以沿着指向父节点的指针一直向上遍历,知道找到一个是它父节点的右子节点的左子节点的节点,就是第一个向右转的子部分根节点. /* struct TreeLinkNode { int val; struct Tr

剑指Offer 二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 思路: 直接一个中间指针,递归,交换左右节点,节点为叶子节点的时候返回. AC代码: 1 class Solution { 2 public: 3 void Mirror(TreeNode *pRoot) { 4 if(pRoot==NULL) 5 return ; 6 7 TreeNode *

剑指Offer——二叉树的下一个结点

题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 如果该结点存在右子树,那么返回右子树的最左结点. 如果该结点不存在右子树,那么如果该结点不是其父结点的最右结点,那么返回父结点:否则一直找到最大子树的最右结点是该结点,那么返回该最大子树的根结点的父结点. 代码: 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *le

剑指Offer——二叉树的下一个节点

1.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2.代码实现 /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; 指向父节点 TreeLinkNode(int val) { this.val = val; } }

剑指offer——二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 代码实现(Java) 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val