二叉树创建
先创建一个结构体:
typedef struct Lemon1//定义结构体名字,重命名为Lemon
{
int key;//节点数据
struct Lemon1 *parents;//父节点
struct Lemon1 *left;//右子树
struct Lemon1 *right; //左子树
}Lemon;
创建节点:
Lemon* LemonCreatTree()
{
int b;
Lemon *p;//创建结构指针,用来
cin >> b;
if(b==0)//当输入b为0的时候,说明无节点,退出
{
p=NULL;
}
else
{
p=(Lemon*)malloc(sizeof(Lemon));//开扩动态空间
p->key=b;//输入数据
p->left=LemonCreatTree();
p->right=LemonCreatTree();
//用递归的方式来创建左右子树的数据 。
}
return p;//返回该头指针
}
创建节点需要注意的情况:
- 这里创建节点是先从根到左子树,在到右子树,如果想要不同,交换一下递归函数顺序就行了。
- 这里输入的时候,是以0为节点结束(就是无节点的意思),这里可以改变if(b==“你所规定结束的标志")。
- 输入的时候想要得到这样二叉树:
需输入顺序:6->2->1->0->0->4->3->0->0->0->8->0.
遍历:
- 第一种遍历叫做前序遍历,遍历原则是先根->左子树->右子树的遍历。
void LemonPreTrave(Lemon* root)
{
if(root)
{
cout << root->key << " ";
LemonPreTrave(root->left);
LemonPreTrave(root->right);
}
}
- 中序遍历:遍历原则为左子树->根->右子树。
//中序遍历
void LemonCenterTrave(Lemon* root)
{
if(root)
{
LemonCenterTrave(root->left);
cout << root->key << " ";
LemonCenterTrave(root->right);
}
}
- 后序遍历:原则为左子树->右子树->根。
void LemonBackTrave(Lemon* root)
{
if(root)
{
LemonBackTrave(root->left);
LemonBackTrave(root->right);
cout << root->key << " ";
}
}
寻找结点:
int LemonRootNum(Lemon* root)
{
if(root==NULL)
{
return 0;
}
else
{
return 1+LemonRootNum(root->left)+LemonRootNum(root->right);//左右2边子树的节点加上根节点一个
}
}
寻找树的深度:
这里树的深度以最深那一个分支为主,主要是计算其深度来表示整个树的深度。
int LemonRootNum(Lemon* root)
{
if(root==NULL)
{
return 0;
}
else
{
return 1+LemonRootNum(root->left)+LemonRootNum(root->right);//左右2边子树的节点加上根节点一个
}
}
寻找树叶节点:
这里要讲一下叶节点就是末节点,在往下去,就没有节点存在了。一棵树末端。
int LemonLeafTree(Lemon *root)
{
if(!root)
{
return 0;
}
else if((root->left==NULL)&& root->right==NULL)
{
return 1;
}
else
{
return (LemonLeafTree(root->left)+LemonLeafTree(root->right));
}
}
总代码:
#include<cstdio>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
typedef struct Lemon1//定义结构体名字,重命名为Lemon
{
int key;//节点数据
struct Lemon1 *parents;//父节点
struct Lemon1 *left;//右子树
struct Lemon1 *right; //左子树
}Lemon;
Lemon* LemonCreatTree()
{
int b;
Lemon *p;//创建结构指针,用来
cin >> b;
if(b==0)//当输入b为0的时候,说明无节点,退出
{
p=NULL;
}
else
{
p=(Lemon*)malloc(sizeof(Lemon));//开扩动态空间
p->key=b;//输入数据
p->left=LemonCreatTree();
p->right=LemonCreatTree();
//用递归的方式来创建左右子树的数据 。
}
return p;//返回该头指针
}
//前序遍历
void LemonPreTrave(Lemon* root)
{
if(root)
{
cout << root->key << " ";
LemonPreTrave(root->left);
LemonPreTrave(root->right);
}
}
//中序遍历
void LemonCenterTrave(Lemon* root)
{
if(root)
{
LemonCenterTrave(root->left);
cout << root->key << " ";
LemonCenterTrave(root->right);
}
}
void LemonBackTrave(Lemon* root)
{
if(root)
{
LemonBackTrave(root->left);
LemonBackTrave(root->right);
cout << root->key << " ";
}
}
int LemonRootNum(Lemon* root)
{
if(root==NULL)
{
return 0;
}
else
{
return 1+LemonRootNum(root->left)+LemonRootNum(root->right);//左右2边子树的节点加上根节点一个
}
}
int LemonDepthTree(Lemon* root)
{
if(root)
{
return LemonDepthTree(root->left)>LemonDepthTree(root->right)?LemonDepthTree(root->left)+1:LemonDepthTree(root->right)+1;
}
if(root==NULL)
{
return 0;
}
}
int LemonLeafTree(Lemon *root)
{
if(!root)
{
return 0;
}
else if((root->left==NULL)&& root->right==NULL)
{
return 1;
}
else
{
return (LemonLeafTree(root->left)+LemonLeafTree(root->right));
}
}
int main()
{
Lemon* Lemonroot;
Lemonroot=LemonCreatTree();
//先序遍历
printf("先序遍历:");
LemonPreTrave(Lemonroot);
printf("\n");
//中序遍历
printf("中序遍历:");
LemonCenterTrave(Lemonroot);
printf("\n");
//后序遍历
printf("后序遍历:");
LemonBackTrave(Lemonroot);
printf("\n");
//查找二叉树节点总数目
printf("二叉树节点数");
printf("%d\n",LemonRootNum(Lemonroot));
//寻找二叉树的深度
printf("二叉树的深度");
printf("%d\n",LemonDepthTree(Lemonroot));
//寻找二叉树叶子节点
printf("二叉树叶子节点");
printf("%d\n",LemonLeafTree(Lemonroot));
}