descpription
- 下面代码给出二叉树的构建、计算节点总数、叶子节点总数、深度、前序、中序、后序遍历、销毁的完整代码,在codeblocks上测试过可以直接运行。
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct TreeNode{
int data;
TreeNode* left;
TreeNode* right;
}Node;
//创建二叉树,按照根、左、右的顺序赋值
Node* createTree()
{
Node* p = NULL;
int value;
cin>>value;
if(value == 0){
p = NULL;
}else{
p = (Node*)malloc(sizeof(Node));
p->data = value;
p->left = createTree();
p->right = createTree();
}
return p;
}
//计算节点个数
int numberOfNodes(Node* root)
{
if(NULL == root){
return 0;
}
return 1+numberOfNodes(root->left)+numberOfNodes(root->right);
}
//叶子节点个数
int numberOfLeafNodes(Node* root)
{
if(NULL == root){
return 0;
}
if(root->left == NULL && root->right == NULL){
return 1;
}
return numberOfLeafNodes(root->left)+numberOfLeafNodes(root->right);
}
//计算深度,分别求出左子树的深度、右子树的深度,两个深度的较大值+1
int depthTree(Node* root)
{
if(NULL == root){
return 0;
}
int left_depth = depthTree(root->left);
int right_depth = depthTree(root->right);
return left_depth>right_depth?left_depth+1:right_depth+1;
}
//前序遍历
void preOrderTravel(Node* root)
{
if(NULL == root){
return;
}
cout<<root->data<<" ";
preOrderTravel(root->left);
preOrderTravel(root->right);
}
//中序遍历
void midOrderTravel(Node* root)
{
if(NULL == root){
return;
}
midOrderTravel(root->left);
cout<<root->data<<" ";
midOrderTravel(root->right);
}
//后序遍历
void lastOrderTravel(Node* root)
{
if(NULL == root){
return;
}
lastOrderTravel(root->left);
lastOrderTravel(root->right);
cout<<root->data<<" ";
}
//删除二叉树,释放空间
void deleteTree(Node* root)
{
if(NULL == root){
return;
}
deleteTree(root->left);
deleteTree(root->right);
free(root);
root = NULL;
}
int main()
{
cout<<"create binary tree."<<endl;
Node* root = NULL;
root = createTree();
cout<<"number of nodes:";
cout<<numberOfNodes(root);
cout<<endl;
cout<<"numberOfLeafNodes:";
cout<<numberOfLeafNodes(root);
cout<<endl;
cout<<"depthTree:";
cout<<depthTree(root);
cout<<endl;
cout<<"preOrderTravel:";
preOrderTravel(root);
cout<<endl;
cout<<"midOrderTravel:";
midOrderTravel(root);
cout<<endl;
cout<<"lastOrderTravel:";
lastOrderTravel(root);
cout<<endl;
deleteTree(root);
return 0;
}
运行输入:
1 2 4 8 0 0 9 0 0 5 0 0 3 6 0 0 7 0 0
构建的二叉树如下:
输出结果如下: