码迷,mamicode.com
首页 > 编程语言 > 详细

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

时间:2015-01-06 15:36:02      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

//叶子节点的个数
/*
(1)如果二叉树为空,返回0
(2)如果二叉树不为空且左右子树为空,返回1
(3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
*/

int GetLeafNodeNum(BTree* root)
{
	if(root == NULL)
		return 0;
	if(root->m_pLeft == NULL && root->m_pRight == NULL)
		return 1;

	int LeafNumOfLeft = GetLeafNodeNum(root->m_pLeft);
	int LeafNumOfRight = GetLeafNodeNum(root->m_pRight);

	int ret = LeafNumOfLeft + LeafNumOfRight;

	return ret;

}


 

/*
判断量个二叉树的结构是否相同
1:如果两个二叉树都为空,那么返回true
2:如果一个二叉树为空,另外一个不为空,那么返回false
3:如果两个二叉树都不为空,那么如果它们的左子树和右子树的结果相同,返回true否则返回false

*/

bool isEqual(BTree*  root1, BTree* root2)
{
	if(root1 == NULL && root2 == NULL)
		return true;
	else if ((root1 == NULL && root2!= NULL)|| (root1 != NULL && root2 == NULL))
		return false;

	bool equalLeft = isEqual(root1->m_pLeft,root2->m_pLeft);
	bool equalRight = isEqual(root1->m_pRight,root2->m_pRight);

	return (equalLeft && equalRight);
}


完整测试代码:

// BTNumOfKLevel.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;



class BTree
{
public:
	int     m_nValue;
	BTree*  m_pLeft;
	BTree*  m_pRight;

	BTree(int m):m_nValue(m)
	{
		m_pLeft = m_pRight = NULL;
	}

};
//二叉树的插入实现
void Insert(int value, BTree* &root)
{
	if (root == NULL)
	{
		root = new BTree(value);
	}
	else if(value < root->m_nValue)
		Insert(value,root->m_pLeft);
	else if(value > root->m_nValue)
		Insert(value,root->m_pRight);
	else
		;
}


//叶子节点的个数
/*
(1)如果二叉树为空,返回0
(2)如果二叉树不为空且左右子树为空,返回1
(3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
*/
int GetLeafNodeNum(BTree* root)
{
	if(root == NULL)
		return 0;
	if(root->m_pLeft == NULL && root->m_pRight == NULL)
		return 1;

	int LeafNumOfLeft = GetLeafNodeNum(root->m_pLeft);
	int LeafNumOfRight = GetLeafNodeNum(root->m_pRight);

	int ret = LeafNumOfLeft + LeafNumOfRight;

	return ret;

}

/*
判断量个二叉树的结构是否相同
1:如果两个二叉树都为空,那么返回true
2:如果一个二叉树为空,另外一个不为空,那么返回false
3:如果两个二叉树都不为空,那么如果它们的左子树和右子树的结果相同,返回true否则返回false

*/

bool isEqual(BTree*  root1, BTree* root2)
{
	if(root1 == NULL && root2 == NULL)
		return true;
	else if ((root1 == NULL && root2!= NULL)|| (root1 != NULL && root2 == NULL))
		return false;

	bool equalLeft = isEqual(root1->m_pLeft,root2->m_pLeft);
	bool equalRight = isEqual(root1->m_pRight,root2->m_pRight);

	return (equalLeft && equalRight);
}


int _tmain(int argc, _TCHAR* argv[])
{
	BTree* m_pRoot = new BTree(4);
	Insert(3,m_pRoot);
	Insert(6,m_pRoot);
	Insert(1,m_pRoot);
	Insert(2,m_pRoot);
	Insert(5,m_pRoot);
	Insert(8,m_pRoot);
	Insert(7,m_pRoot);
	Insert(10,m_pRoot);

	BTree* m_pRoot2 = new BTree(4);
	Insert(3,m_pRoot2);
	Insert(6,m_pRoot2);
	Insert(1,m_pRoot2);
	Insert(2,m_pRoot2);
	Insert(5,m_pRoot2);
	Insert(8,m_pRoot2);
	Insert(7,m_pRoot2);
	Insert(10,m_pRoot2);

	int count = GetLeafNodeNum(m_pRoot);
	cout<<"叶子节点的个数为:"<<count<<endl;

	cout<<"两个树的结构是否相同:"<<isEqual(m_pRoot,m_pRoot2);

	getchar();
	return 0;
}


 

 

 

 

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

标签:

原文地址:http://blog.csdn.net/djb100316878/article/details/42459177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!