// 判断两棵二叉树是否完全相同
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val != q->val)
return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
// 如果要判断二叉树是否对称 把该函数嵌进去就行
class Solution {
public:
bool isSymmetrical(TreeNode* l1, TreeNode* l2)
{
if (l1 == NULL && l2 == NULL)
return true;
if (l1 == NULL || l2 == NULL)
return false;
if (l1->val != l2->val)
return false;
return isSymmetrical(l1->left, l2->right) && isSymmetrical(l1->right, l2->left);
}
bool isSymmetrical(TreeNode* pRoot)
{
return isSymmetrical(pRoot, pRoot);
}
};
// 计算二叉树叶子节点个数(递归方法)
int Num_of_Leaves(TreeNode* p) {
if (p == NULL)
return 0;
if (p->left == NULL && p->right == NULL)
return 1;
return (Num_of_Leaves(p->left) + Num_of_Leaves(p->right));
}
都是很容易读懂,很容易写出来的递归,下面是全部代码,用于测试
#include <iostream>
using namespace std;
#define D(x) cout<<#x<<"="<<x<<endl;
typedef struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
} BiNode, *BiTree;
// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)
BiTree createBiTree()
{
BiTree T;
char c;
cin >> c;
if (c == '#')
T = NULL;
else {
T = new BiNode; // 或 T = (BiTree)malloc(sizeof(BiNode));
T->val = c;
T->left = createBiTree();
T->right = createBiTree();
}
return T;
}
// 前序遍历
void PreOrderTraverse(BiTree T) {
if (T) {
cout << T->val << endl;
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
}
// 二叉树叶子节点个数(递归方法)
int Num_of_Leaves(TreeNode* p) {
if (p == NULL)
return 0;
if (p->left == NULL && p->right == NULL)
return 1;
return (Num_of_Leaves(p->left) + Num_of_Leaves(p->right));
}
// 判断两棵二叉树是否完全相同
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val != q->val)
return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
int main() {
BiTree T1 = createBiTree(); // 建立
//123###7#9##
//12##5##
//12###
PreOrderTraverse(T1); // 输出
BiTree T2 = createBiTree(); // 建立
PreOrderTraverse(T2); // 输出
int num1 = Num_of_Leaves(T1);
int num2 = Num_of_Leaves(T2);
bool flag = isSameTree(T1, T2);
D(flag)
D(num1)D(num2)
return 0;
}
对于树的输入,举个栗子
在 http://mshang.ca/syntree/ 中输入:[1 [2 [3 [#] [#]] [#] ] [7 [#] [9 [#] [#] ]]]
也就是在代码编译完成后输入 123###7#9## 就会得到上面的树