求二叉树的深度 python

题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
解题思路

两种解法,一种是第一时间的思路,即获得根节点到每个叶节点的深度,取其中最长的返回:

class Solution:
    def __init__(self):
        self.maxDeep = 0
        self.curDeep = 0

def TreeDepth(self, pRoot):
        if not pRoot:
            return 0
        self.curDeep += 1
        self.TreeDepth(pRoot.left)
        self.maxDeep = self.curDeep if self.curDeep > self.maxDeep else self.maxDeep
        self.TreeDepth(pRoot.right)
        self.maxDeep = self.curDeep if self.curDeep > self.maxDeep else self.maxDeep
        self.curDeep -= 1

这种方案可以解决问题,但是代码不好看,还定义了两个公共变量。第二种解法是自底而上,每当从子节点回退到其父节点时,返回左右子节点中最深的分支值,没有公共变量,代码短小精悍:

def TreeDeep(self, pRoot):
    if not pRoot:
        return 0
    left = self.TreeDeep(pRoot.left)+1
    right = self.TreeDeep(pRoot.right)+1
    return left if left>right else right

如果想进一步缩短代码高度,那就把left和right的表达式带入第6行代码中。虽然代码高度进一步缩短,但是增加了代码宽度,且降低了代码的可读性,《Clean Code》中所不建议的方式,所以就到此为止了~
————————————————
版权声明:本文为CSDN博主「goddaniel」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010005281/article/details/79659747

  二叉树有深度和高度两个属性,一个节点的深度指的是从根节点到该节点路径的长度,根节点的深度为1;一个节点的高度指的是从该节点到叶子节点所有路径上包含节点个数的最大值。叶子节点的高度为1,往上节点的高度依次递增。所以要求二叉树的深度,我们要求出从根节点到叶子结点最长路径的长度,从根节点到所有的叶子结点,实际就是在遍历这棵树,使用深度优先遍历可以解决这个问题。

  首先还是定义一颗二叉树的类。

1 class TreeNode:
2     def __init__(self, x):
3         self.val = x
4         self.left = None
5         self.right = None

  然后,为了得到从根节点到叶子结点路径的长度,我们从根节点出发,进行深度优先遍历,当遍历到一个叶子结点时,就计算出了一条路径的长度,这时返回到上一层,即叶子结点的父亲节点,继续对另一颗子树进行深度优先遍历,计算其他路径的长度。因此,这里有两个问题,第一,我们需要一个变量保存当前遍历路径的长度,它保存的一定是当前遍历的路径长度,应该作为函数的参数(深度优先遍历的函数);第二,当遍历到叶子节点时,我们要判断这条路径的长度是否是最长的,因此还需要一个变量来保存当前最长的路径长度,它不会随着函数的迭代改变,应当是一个全局变量,代码如下。

class Solution:
     #二叉树的深度
    def TreeDepth(self, pRoot):
    # write code here
        global maxdepth#全局变量保存当前最长的路径长度
        maxdepth=0
        def DfsTree(root,depth=0):#depth是当前的路径长度
            global maxdepth
            if root:#节点非空,路径长度加1
                depth+=1
            if root.left:#左子树非空,继续遍历左子树
                DfsTree(root.left,depth)
            if root.right:#右子树非空,继续遍历右子树
                DfsTree(root.right,depth)
            if not root.left or root.right:#左右子树都是空的,即该节点是一个叶子结点,则判断depth是不是最长的路径
                if depth>maxdepth:
                    maxdepth=depth
        if root:
            DfsTree(root)
        return maxdepth

原文地址:https://www.cnblogs.com/fengff/p/11506323.html

时间: 2024-07-28 22:02:44

求二叉树的深度 python的相关文章

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

求二叉树的深度代码实现

用递归的方案实现: 1 /* 求二叉树的深度 */ 2 int getDepthBiTree(BITREENODE* T) 3 { 4 int lDepth = 0, rDepth = 0; 5 6 if(T == NULL) 7 { 8 return 0; 9 } 10 else 11 { 12 lDepth = getDepthBiTree(T->lchild); 13 rDepth = getDepthBiTree(T->rchild); 14 } 15 16 return lDepth

[华为机试练习题]42.求二叉树的深度和宽度

题目 题目标题: 求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / b c / \ / d e f g 返回3. 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败或

PTA 求二叉树的深度

6-7 求二叉树的深度 (6 分) 本题要求实现一个函数,可返回二叉树的深度. 函数接口定义: int Depth(BiTree T); T是二叉树树根指针,函数Depth返回二叉树的深度,若树为空,返回0. 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *r

[数据结构]求二叉树的深度与宽度

二叉树数据结构声明: struct TreeNode { int val; TreeNode *left; TreeNode *right; }; 1.递归求二叉树深度 int getDepth(TreeNode *root) { if (root == NULL) { return 0; } return getDepth(root->left) > getDepth(root->right) ?(getDepth(root->left) + 1) : (getDepth(roo

求二叉树的深度和宽度 ----我对默认构造函数的理解

////计算二叉树的深度和宽度:深度:层数   宽度:各层最大节点数 ///关于二叉树问题,一般都要用到递归的方法. ////算法:首先构造二叉树节点的结构:要创建二叉树,创建的过程,使用递归算法:其次,计算二叉树深度,也要递归:最难的一点是计算求出层次中的最大节点数,使用队列的方法 #include <iostream>#include <queue>#include <tchar.h>using namespace std;struct BTNode{ char m

求二叉树的深度和广度算法

1.常见二叉树数据结构如下: /* * Definition for a binary tree node. */ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 2.二叉树的深度 可以使用递归算法分别求出左子树和右子树的深度,两个深度的较大值 +1 即可.代码如下: public static int getMa

求二叉树的深度和宽度[Java]

这个是常见的对二叉树的操作.总结一下: 设节点的数据结构,如下: 1 class TreeNode { 2 char val; 3 TreeNode left = null; 4 TreeNode right = null; 5 6 TreeNode(char _val) { 7 this.val = _val; 8 } 9 } 1.二叉树深度 这个可以使用递归,分别求出左子树的深度.右子树的深度,两个深度的较大值+1即可. 1 // 获取最大深度 2 public static int get

求二叉树的深度和宽度

深度: int length(BiTree t) {           int depth1 = 0;           int depth2 = 0;                      if(t == null ) return 0;           //右子树的深度           depth1 = length(t.right);           //左子树的深度           depth2 = length(t.left);