BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
BiTreeNode* root;
char item = s[i++];
if(i>=len || item=='#')
{
root=NULL;
}
else
{
root = new BiTreeNode(item);
root->left = CreatBiTree(s, i, len);
root->right = CreatBiTree(s, i, len);
}
return root;
}
int main(int argc, const char * argv[]) {
// insert code here...
char str[200];
scanf("%s", str);
int i = 0;
int len = int(strlen(str));
BiTreeNode* root = CreatBiTree(str, i, len);
cout<<GetTreeDepth(root)<<endl;
cout<<GetNodeNumber(root)<<endl;
cout<<GetLeafNodeNumber(root)<<endl;
return 0;
}
using namespace std;
struct BiTreeNode {
char data; // 树节点元素
BiTreeNode* left; // 左子树指针
BiTreeNode* right; // 右子树指针
BiTreeNode(){ // 树节点初始化
left=NULL;
right=NULL;
}
BiTreeNode(char item){ // 用元素初始化树节点
data=item;
left=NULL;
right=NULL;
}
~BiTreeNode(){ // 释放树节点内存
left=NULL;
right=NULL;
}
};
BiTreeNode* CreatBiTree(char* s, int &i, int len);
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
int GetTreeDepth(BiTreeNode* root);
// 计算该二叉树的深度
// 参数:二叉树根节点root
// 返回:二叉树的深度
int GetNodeNumber(BiTreeNode* root);
// 计算该二叉树的总节点个数
// 参数:二叉树根节点root
// 返回:二叉树的总节点个数
int GetLeafNodeNumber(BiTreeNode* root);
// 计算该二叉树的叶子节点个数
// 参数:二叉树根节点root
// 返回:二叉树的叶子节点个数
int GetTreeDepth(BiTreeNode* root)
// 计算该二叉树的深度
// 参数:二叉树根节点root
// 返回:二叉树的深度
{
if(root==NULL)return (0);
int l=GetTreeDepth(root->left);
int r=GetTreeDepth(root->right);
return (1+(l>r?l:r));
}
int i=0;
int GetNodeNumber(BiTreeNode* root)
// 计算该二叉树的总节点个数
// 参数:二叉树根节点root
// 返回:二叉树的总节点个数
{
if(root==NULL)return 0;
i++;
if(root->left!=NULL){
GetNodeNumber(root->left);
}
if(root->right!=NULL){
GetNodeNumber(root->right);
}
return i;
}
int p=0;
int GetLeafNodeNumber(BiTreeNode* root)
// 计算该二叉树的叶子节点个数
// 参数:二叉树根节点root
// 返回:二叉树的叶子节点个数
{
if(root==NULL)return 0;
if(root->left==NULL&&root->right==NULL){
p++;
}
if(root->left!=NULL){
GetLeafNodeNumber(root->left);
}
if(root->right!=NULL){
GetLeafNodeNumber(root->right);
}
return p;
}