打印二叉树的深度

这道题本质上还是考查二元树的遍历

如果一棵树只有一个结点,它的深度为1。如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1。如果既有右子树又有左子树呢?那该树的深度就是其左、右子树深度的较大值再加1。

上面的这个思路用递归的方法很容易实现,只需要对遍历的代码稍作修改即可

参考资料:剑指offer

代码:

#include <iostream>
using namespace std;

typedef struct node{
	int data;
	struct node *lchild;
	struct node *rchild;
}Node ,*pNode;

void createTree(pNode & root){
	int temp;
	scanf("%d",&temp);
	if(0 != temp){
		root=(pNode) malloc (sizeof(Node));
		root->data = temp;
		createTree(root->lchild);
		createTree(root->rchild);
	}else{
		root=NULL;
	}

}

void print(const pNode root){
    pNode p = root;
	if(p){
		cout<< p->data<< " ";
		print(p->lchild);
		print(p->rchild);
	}

}
//类似先序遍历,节点会重复访问,效率较低
int btDepth(const pNode  root){
	if(NULL == root)
		return 0;
	int left = btDepth(root->lchild);
	int right = btDepth(root->rchild);
	return left > right ? left + 1 : right + 1;
}

//类似后序遍历,效率比较高,不会重复访问节点
void  btDepth(const pNode  root,int &depth){
	if(NULL == root){
		depth=0;
		return ;
	}
	int left ;
	btDepth(root->lchild,left);

    int right ;
	btDepth(root->rchild,right);
	depth = left > right ? left +1 : right +1;
}
int main(){
	pNode root=NULL;
	createTree(root);
	print(root);
	cout<<endl;
	cout<<btDepth(root);
	int depth=0;
	btDepth(root,depth);
	cout<<endl<<depth;
	return 0;

}

二叉树测试:

运行结果:

打印二叉树的深度

时间: 2024-12-19 14:29:36

打印二叉树的深度的相关文章

2013-03-17---二叉树递归,非递归实现(附代码)深度,叶子节点数量,逐行打印二叉树

昨天晚上没有发文章,说来话长啊,昨天不知道是csdn的问题,还是我的问题,我访问了半天,访问不上网站啊,后来12点多了,就睡了.上一篇文章说到了二叉树的先序,中序,后序遍历问题,这次还是说的简单的一点,说计算二叉树的深度,和叶子节点数量 int ceng(Node *pRoot) //计算层数,递归实现 { int left = 0; int right = 0; int res = 0; if (pRoot == NULL) { return 0; } if (pRoot->pLeft !=

二叉树的深度相关问题

题目 输入一颗二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的结点形成树的一条路径,最长路径的长度为树的深度. 思路 简化一下题目,思考一个节点的时候二叉树的深度为 1,因为左右子树都为0: 2个节点的时候二叉树深度为 2,左右子树的深度最大值加 1: 3个节点分两种情况: 4                   3 /  \                    \ 3   5                   4 \ 5 我们由这两种情况可以看出来,任意一颗二叉树的深度就是它的左右

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <queue> using namespace std; struct BTNode { char m_value; BTNode *m_left; BTNode *m_right; }; //先序创建二叉树 void CreatBTree(BTNode *&root) { char nV

从上往下打印二叉树(分层遍历)

从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直到队列中所有的节点都被打印出来为止. struct TreeNode { int val; TreeNode* left; TreeNode* right; }; void LevelOrder(BinaryTreeNode* root) { if (roo

剑指Offer面试题23(Java版):从上往下打印二叉树

题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11. 这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序.中序或者后序遍历.由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程. 因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析.为了接下来能够打印8的结点的两个子节点,我们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器中,现在容器内就有两个结点了.

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

打印二叉树节点数值总和等于某个给定节点的所有路径

打印二叉树节点数值总和等于某个给定节点的所有路径,路径可以从任意节点开始,任意节点结束. 比如,假设和是8,树如下 的路径有  [[5,3],[8],[5,1,2]].  5  / \ 3     1 /\     /\ 4  8  2   6 思路:遍历所有路径,对于每一个节点,在其路径中向后寻找sum和为target的路径加入到结果中. public List<List<Integer>> findSum(TreeNode root,int sum){ List<List

二叉树系列 - 二叉树的深度,例 [LeetCode]

二叉树的深度的概念最值得注意的地方,在于 到"叶子"节点的距离. 一般来说,如果直接说“深度”,都是指最大深度,即最远叶子的距离. 这里放两道例题,最小深度和最大深度. 1. 二叉树的最小深度 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest