C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同
2015-01-06 14:50
806 查看
//叶子节点的个数
/*
(1)如果二叉树为空,返回0
(2)如果二叉树不为空且左右子树为空,返回1
(3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
*/
/*
判断量个二叉树的结构是否相同
1:如果两个二叉树都为空,那么返回true
2:如果一个二叉树为空,另外一个不为空,那么返回false
3:如果两个二叉树都不为空,那么如果它们的左子树和右子树的结果相同,返回true否则返回false
*/
完整测试代码:
/*
(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++二叉树(统计叶节点,判断两颗二叉树是否相等,交换二叉树的左孩子右孩子,输出叶子到根节点的路径)
- Java代码 给出一个二叉树和一个数,判断该二叉树是否存在一个从根节点到叶节点的和与给出的数相同
- 二叉树面试题(一)---判断两个二叉树结构是否相同
- 【判断两棵二叉排序树是否相同】数据结构实验之查找一:二叉排序树
- 算法编程题-判断一颗树中是否有与另一棵树拓扑结构完全相同的子树
- 判断两个二叉树是否结构相同
- Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同
- Leetcode Same Tree 判断两棵二叉树是否相同
- 面试题18:如何判断两棵二叉树是否相同?
- 判断两棵二叉树是否相同
- C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)
- Same Tree:判断两棵二叉树是否相同
- 二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树
- 判断两棵二叉树是否相同的树
- 【数据结构与算法】二叉树给定两个节点的最短距离(C++实现)
- 算法 - 判断两个二叉树是否相同
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
- 判断是否存在拓扑结构相同的子树(C++版)