#include<bits/stdc++.h>
using namespace std;
struct Tnode
{
int data;
struct Tnode* left;
struct Tnode* right;
int layer;
};
typedef struct Tnode *btree;
int height(btree root)//递归求数的高度 传入一个二叉树 根节点自身算作一层高度
{
if(!root) //如果是一颗空树 返回0
return 0;
else //如果非空 则 求求其左右子树高度 取最大再加上自身
{
int hleft=height(root->left); //左子树高
int hright=height(root->right); //右子树高
return max(hleft,hright)+1;//这里的1代表当前根节点的高度
}
}
void creat_btree(btree &root)
{
int element;
cin>>element;
if(element==0)
{
root=NULL;
return;
}
else
{
root=(btree)malloc(sizeof(struct Tnode));
root->data=element;
root->left=NULL;
root->right=NULL;
creat_btree(root->left);
creat_btree(root->right);
}
}
void preorder_travel(btree root)
{
if(root)
{
cout<<root->data<<" ";
preorder_travel(root->left);
preorder_travel(root->right);
}
else
return ;
}
void inorder_travel(btree root)
{
if(root)
{
inorder_travel(root->left);
cout<<root->data<<" ";
inorder_travel(root->right);
}
else
return ;
}
void postorder_travel(btree root)
{
if(root)
{
preorder_travel(root->left);
preorder_travel(root->right);
cout<<root->data<<" ";
}
else
return ;
}
void layer_travel(btree root)
{
queue<btree>q;//存放指向结点的指针 不能存放数据 不然就会丢失左右孩子
q.push(root);
root->layer=1;
while(!q.empty())
{
btree p=q.front();//取出队首
q.pop();
cout<<p->data<<" ";
if(p->left)
{
q.push(p->left);
p->left->layer=p->layer+1;
}
if(p->right)
{
q.push(p->right);
p->right->layer=p->layer+1;
}
}
}
int main()
{
btree root;//创建一个指针
creat_btree(root);//创建二叉树
preorder_travel(root);//前序遍历二叉树
cout<<endl;
inorder_travel(root);//中序遍历二叉树
cout<<endl;
postorder_travel(root);//后序遍历二叉树
cout<<endl;
layer_travel(root);//层次遍历二叉树 队列中存放的是地址 并标记了树中每个结点的层次
cout<<endl;
cout<<height(root);//求二叉树的高度
return 0;
}
关于二叉树结构的各种知识做一个整理 创建二叉树的方法一定要注意 是用0作为结点为空的条件的
最新推荐文章于 2022-09-30 22:52:02 发布