求二叉树的深度算法

算法的思想:

  采用二叉树的后序遍历非递归算法。由于后序遍历非递归算法使用一个栈实现,每次都会在一条路径上走到最底层才向上访问,再向右访问。因此,记录下栈在遍历中的最大值,即为二叉树的最大深度。

#include <iostream>
#include <stack>
using namespace std;
struct BinTree
{
    int data;
    BinTree *lc;
    BinTree *rc;
}BTNode,*BinTree;
int max(int a,int b)
{
    return (a>b)?a:b;
}

int BinTreeDepth(BinTree T)
{
    stack<BinTree> s;
    BinTree p = T,r = NULL;
    int depth=0;
    while(p||!s.empty())
    {
        if(p)
        {    //从根节点向左边走
            s.push(p);
            int size = s.size();//获取栈的大小
            depth = max(depth,size);//替换最大值
            p = p->lc;
        }
        else
        {    //左边走不通向右走
            p = s.top();
            if(p->rc&&p->rc!=r)//如果右子树存在,且未被访问过
            {
                p = p->rc;
                s.push(p);
                int size = s.size();//获取栈的大小
                depth = max(depth,size);//替换最大值
                p = p->lc;
            }else
            {
                p=s.top();
                s.pop();
                cout<<p->data<<endl;
                r=p;            //记录最近访问的节点
                p=NULL;            //节点访问完之后,重置p指针,目的是为了防止再次将左孩子压栈
            }
        }
    }
    return depth;
}
时间: 2024-11-05 11:15:51

求二叉树的深度算法的相关文章

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(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

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

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

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

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

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

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

二叉树数据结构声明: 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

求二叉树的深度 python

题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.解题思路 两种解法,一种是第一时间的思路,即获得根节点到每个叶节点的深度,取其中最长的返回: class Solution:    def __init__(self):        self.maxDeep = 0        self.curDeep = 0 def TreeDepth(self, pRoot):        if not pRoot: