二叉树深度的计算

二叉树的宽度定义为具有最多结点数的层中包含的结点数,试计算一二叉树的深度。

#include "stdafx.h"
#include<iostream>
#include<vector>

using namespace std;

struct BiNOde
{
	int ele;
	BiNOde* lnode;
	BiNOde* rnode;
};

vector<int>aa;
int maxdepth = 0;

BiNOde*create_tree()
{
	BiNOde * root = new BiNOde;
	BiNOde*node1 = new BiNOde;
	BiNOde*node2 = new BiNOde;
	BiNOde*node3 = new BiNOde;
	BiNOde*node4 = new BiNOde;
	BiNOde*node5 = new BiNOde;
	BiNOde*node6 = new BiNOde;
	BiNOde*node7 = new BiNOde;
	BiNOde*node8 = new BiNOde;
	BiNOde*node9 = new BiNOde;
	BiNOde*node10 = new BiNOde;
	BiNOde*node11 = new BiNOde;
	root->ele = 0;
	node1->ele = 1;
	node2->ele = 2;
	node3->ele = 3;
	node4->ele = 4;
	node5->ele = 5;
	node6->ele = 6;
	node7->ele = 7;
	node8->ele = 8;
	node9->ele = 9;
	node10->ele = 10;
	node11->ele = 11;
	root->lnode = node1;
	root->rnode = node2;
	node1->lnode = node3;
	node1->rnode = node4;
	node2->lnode = node7;
	node2->rnode = node8;
	node3->lnode = node5;
	node3->rnode = node11;
	node4->lnode = node10;
	node4->rnode = NULL;
	node5->lnode = node6;
	node5->rnode = NULL;
	node6->lnode = NULL;
	node6->rnode = NULL;
	node7->lnode = node9;
	node7->rnode = NULL;
	node8->lnode = NULL;
	node8->rnode = NULL;
	node9->lnode = NULL;
	node9->rnode = NULL;
	node10->lnode = NULL;
	node10->rnode = NULL;
	node11->lnode = NULL;
	node11->rnode = NULL;
	//BiNOde*node12 = new BiNOde;
	//node12->ele = 12;
	//node12->lnode = NULL;
	//node12->rnode = NULL;
	//node6->lnode = node11;  

	return root;
}

void PreOrderTraverseTree(BiNOde*node,BiNOde*root)
{
	if (node == NULL)
		return ;
	if(node==root)
	{
		root->ele=0;
		aa.push_back(1);
	}
	else
	{
		aa[node->ele]++;
	}
	if (node->lnode != NULL)
	{
		node->lnode->ele=node->ele+1;
		if (node->lnode->ele > aa.size()-1)
			aa.push_back(0);
		PreOrderTraverseTree(node->lnode, root);

	}
	if (node->rnode != NULL)
	{
		node->rnode->ele=node->ele+1;
		if (node->rnode->ele > aa.size()-1)
			aa.push_back(0);
		PreOrderTraverseTree(node->rnode, root);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	BiNOde*root=create_tree();
	PreOrderTraverseTree(root, root);
	maxdepth=aa.size()-1;

	for (int i = 0; i < maxdepth+1; i++)
		cout<<aa[i]<<endl;

	system("pause");
	return 0;
}

注意,原二叉树要留一份拷贝

#include "stdafx.h"
#include<iostream>
#include<vector>

using namespace std;

struct BiNOde
{
	int ele;
	BiNOde* lnode;
	BiNOde* rnode;
};

vector<int>aa;
int maxdepth = 0;

BiNOde*create_tree()
{
	BiNOde * root = new BiNOde;
	BiNOde*node1 = new BiNOde;
	BiNOde*node2 = new BiNOde;
	BiNOde*node3 = new BiNOde;
	BiNOde*node4 = new BiNOde;
	BiNOde*node5 = new BiNOde;
	BiNOde*node6 = new BiNOde;
	BiNOde*node7 = new BiNOde;
	BiNOde*node8 = new BiNOde;
	BiNOde*node9 = new BiNOde;
	BiNOde*node10 = new BiNOde;
	BiNOde*node11 = new BiNOde;
	root->ele = 0;
	node1->ele = 1;
	node2->ele = 2;
	node3->ele = 3;
	node4->ele = 4;
	node5->ele = 5;
	node6->ele = 6;
	node7->ele = 7;
	node8->ele = 8;
	node9->ele = 9;
	node10->ele = 10;
	node11->ele = 11;
	root->lnode = node1;
	root->rnode = node2;
	node1->lnode = node3;
	node1->rnode = node4;
	node2->lnode = node7;
	node2->rnode = node8;
	node3->lnode = node5;
	node3->rnode = node11;
	node4->lnode = node10;
	node4->rnode = NULL;
	node5->lnode = node6;
	node5->rnode = NULL;
	node6->lnode = NULL;
	node6->rnode = NULL;
	node7->lnode = node9;
	node7->rnode = NULL;
	node8->lnode = NULL;
	node8->rnode = NULL;
	node9->lnode = NULL;
	node9->rnode = NULL;
	node10->lnode = NULL;
	node10->rnode = NULL;
	node11->lnode = NULL;
	node11->rnode = NULL;
	//BiNOde*node12 = new BiNOde;
	//node12->ele = 12;
	//node12->lnode = NULL;
	//node12->rnode = NULL;
	//node6->lnode = node11;  

	return root;
}

void PreOrderTraverseTree(BiNOde*node,BiNOde*root)
{
	if (node == NULL)
		return ;
	if(node==root)
	{
		root->ele=0;
		aa.push_back(1);
	}
	else
	{
		aa[node->ele]++;
	}
	if (node->lnode != NULL)
	{
		node->lnode->ele=node->ele+1;
		if (node->lnode->ele > aa.size()-1)
			aa.push_back(0);
		PreOrderTraverseTree(node->lnode, root);

	}
	if (node->rnode != NULL)
	{
		node->rnode->ele=node->ele+1;
		if (node->rnode->ele > aa.size()-1)
			aa.push_back(0);
		PreOrderTraverseTree(node->rnode, root);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	BiNOde*root=create_tree();
	PreOrderTraverseTree(root, root);
	maxdepth=aa.size()-1;

	for (int i = 0; i < maxdepth+1; i++)
		cout<<aa[i]<<endl;

	system("pause");
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 05:59:38

二叉树深度的计算的相关文章

一步一步写算法(之二叉树深度遍历)

原文:一步一步写算法(之二叉树深度遍历) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 深度遍历是软件开发中经常遇到的遍历方法.常用的遍历方法主要有下面三种:(1)前序遍历:(2)中序遍历:(3)后序遍历.按照递归的方法,这三种遍历的方法其实都不困难,前序遍历就是根-左-右,中序遍历就是左-根-右,后续遍历就是左-右-根.代码实现起来也不复杂. 1)前序遍历 void preorder_traverse(TREE_NODE* pTree

求二叉树深度

概念: 1.二叉树深度:树中结点的最大层次称为树的深度或高度. 2.二叉树层次:从根开始定义起,根为第一层,根的孩子为第二层,以此类推. 要点: 1.递归. 2.二叉树深度为左右子树深度较大值+1. 代码: /* 求二叉树深度 by Rowandjj 2014/7/13 ------------------------------- 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 输入: 第一行输入有n,n表示

二叉树(4)----求二叉树深度

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树深度 定义:对任意一个子树的根节点来说,它的深度=左右子树

【数据结构与算法】二叉树深度遍历(递归)

二叉树的深度遍历用递归的话就没有什么好说的了. 代码实现 /** * 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:[email protected] * 作者:A2BGeek */ public class TreeIteratorRecursion { class TreeNode<T> { private T mNodeData; private TreeNode<T> mLeftChi

剑指offer (39) 二叉树深度

题目:输入一棵二叉树的根节点,求该树的深度 题解分析: 二叉树具有天然的递归性,首先应该想递归解法 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDept

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里. 图示 代码实现 /** * 源代码名称:TreeIteratorNoRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历(非递归) * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class TreeIteratorNoRecursion { class TreeNode<T> { private T mNod

二叉树之 二叉树深度

二叉树深度: // 获取最大深度 public static int getMaxDepth(TreeNode root) { if (root == null) return 0; else { int left = getMaxDepth(root.left); int right = getMaxDepth(root.right); return 1 + Math.max(left, right); } } 二叉树宽度: 使用队列,层次遍历二叉树.在上一层遍历完成后,下一层的所有节点已经放

深度学习计算模型中“门函数(Gating Function)”的作用

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 看深度学习文献,门函数基本上已经是你必然会遇到的一个概念了,最典型的就是LSTM,首先上来你就得过得去"遗忘门""输入门""输出门"这三个门.门函数本身是个独立概念,不过LSTM使用多个门函数来组合出一个带有状态记忆的计算模型而已.随着LSTM大行其道,各种计算模型开始在计算过程中引入门函数的概念,相信这些论文你也没少看,其实这也是一种研究模式,比如

二叉树深度和平衡二叉树的判定

二叉树的深度 对于二叉树的深度的求解,利用递归的方式求解很简单: 下面就来设计这个递归算法: 要求一个节点的高度,先求左子树的高度,然后再求解右子树的高度. 最后树的高度就是1+max(left_depth, right_depth). int leftLen = depth_tree(root->left); int rightLen = depth_tree(root->right); return 1 + max(leftLen, rightLen); 那么这个递归的出口是什么: (1)