1019_计算二叉树的高度和结点数

计算二叉树的高度和结点数

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 1152            测试通过 : 355 

比赛描述

二叉树是非常重要的树形数据结构,根据该树的先序、中序或后序遍历序列可以建立一棵二叉树。例如输入先序遍历序列A B # D # # C E # # F # #可以建立图1019-1所示的二叉树,这里用#代表空树或空子树(另一种说法:若无孩子结点,则用#代替),如图1019-2。

1019-1

1019-2

请实现基于遍历的二叉树运算:求高度、计算结点数目



输入

二叉树的先序遍历序列,用#代表空树或空子树。

输出

共五行

前三行依次输出先序、中序和后序遍历序列,

第四行输出二叉树的高度,

第五行依次输出二叉树总结点数目、叶子结点数目、度为1的结点数目。

样例输入

A B # D # # C E # # F # #

样例输出

PreOrder: A B D C E F
InOrder: B D A E C F
PostOrder: D B E F C A
3
6 3 1

提示

//根据先序遍历序列创建一个二叉树!

template<class T>
void BinaryTree<T>::Create(BTNode<T>*& t){
    char c;
    cin>>c;
    if(c=='#')
        t=NULL;
    else{
        t=new BTNode<T>(c);
        Create(t->lChild);
        Create(t->rChild);
    }
}

题目来源

CHENZ


算法思路:关于二叉树的问题一般用递归算法解决。

注意点:

1.#define Max(a,b) (a>b?a:b) 注意后面的括号不能丢,define执行的是文体替换。

2.注意二叉树结点个数关系:N0=N2+1,N=N0+N1+N2,N1=N-2*N0+1

代码如下:

#include <iostream>
using namespace std;
#define Max(a,b) (a>b?a:b)//注意括号

struct TreeNode
{
	char name;
	TreeNode * LChild;
	TreeNode *RChild;
};

TreeNode *CreatTree();//创建二叉树
void PreOrder(TreeNode* root);//先序
void InOrder(TreeNode* root);//中序
void PostOrder(TreeNode* root);//后序
int HighOfTree(TreeNode* root);//计算高度
int NumOfNode(TreeNode* root);//计算节点总数
int NumOfLeaf(TreeNode* root);//计算叶子节点

int main()
{
	int num_node, num_leaf, num_1child, h;
	TreeNode* root = CreatTree();

	cout << "PreOrder:";
	PreOrder(root);
	cout << endl << "InOrder:";
	InOrder(root);
	cout << endl << "PostOrder:";
	PostOrder(root);
	cout << endl;

	h = HighOfTree(root);
	cout << h << endl;

	num_node = NumOfNode(root);
	num_leaf = NumOfLeaf(root);
	if (root == NULL)
		num_1child = 0;
	else
		num_1child = num_node - 2 * num_leaf + 1;//二叉树的性质
	cout << num_node << ' ' << num_leaf << ' ' << num_1child;
	return 0;
}

TreeNode *CreatTree()
{
	char c;
	cin >> c;
	TreeNode* node;
	if (c == '#')
		node = NULL;
	else
	{
		node = new TreeNode();
		node->name = c;
		node->LChild=CreatTree();
		node->RChild = CreatTree();
	}
	return node;
}

void PreOrder(TreeNode* root)
{
	if (root!=NULL)
	{
		cout << ' ' << root->name;
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}
}

void InOrder(TreeNode* root)
{
	if (root!=NULL)
	{
		InOrder(root->LChild);
		cout << ' ' << root->name;
		InOrder(root->RChild);
	}
}

void PostOrder(TreeNode* root)
{
	if (root!=NULL)
	{
		PostOrder(root->LChild);
		PostOrder(root->RChild);
		cout << ' ' << root->name;
	}
}

int HighOfTree(TreeNode* root)
{
	if (root == NULL)
		return 0;
	else
		return Max(HighOfTree(root->LChild), HighOfTree(root->RChild)) + 1;
}

int NumOfNode(TreeNode* root)
{
	if (root == NULL)
		return 0;
	else
		return 1 + NumOfNode(root->LChild) + NumOfNode(root->RChild);
}

int NumOfLeaf(TreeNode* root)
{
	if (root == NULL)
		return 0;
	else if (root->LChild == NULL&&root->RChild == NULL)
		return 1;
	else
		return NumOfLeaf(root->LChild) + NumOfLeaf(root->RChild);
}


面向对象编程可参考这个: 这里

你可能感兴趣的:(C++,1019,南邮OJ,计算二叉树的高度和结点数)