以二叉树链表存储,实现二叉树的建立、先序遍历、中序遍历、后序遍历、统计叶子节点个数
时间: 2023-11-13 15:04:19 浏览: 125
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
下面是以 C++ 语言实现的二叉树链表存储的代码,包括二叉树的建立、先序遍历、中序遍历、后序遍历、统计叶子节点个数的函数。
```cpp
#include<iostream>
using namespace std;
// 二叉树节点定义
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL){} // 构造函数
};
// 建立二叉树
void createTree(TreeNode* &root){
int val;
cin>>val;
if(val == -1){ // 输入-1表示该节点为空
root = NULL;
return;
}
root = new TreeNode(val);
createTree(root->left);
createTree(root->right);
}
// 先序遍历
void preOrder(TreeNode* root){
if(root == NULL) return;
cout<<root->val<<" ";
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历
void inOrder(TreeNode* root){
if(root == NULL) return;
inOrder(root->left);
cout<<root->val<<" ";
inOrder(root->right);
}
// 后序遍历
void postOrder(TreeNode* root){
if(root == NULL) return;
postOrder(root->left);
postOrder(root->right);
cout<<root->val<<" ";
}
// 统计叶子节点个数
int countLeaf(TreeNode* root){
if(root == NULL) return 0;
if(root->left == NULL && root->right == NULL) return 1;
return countLeaf(root->left) + countLeaf(root->right);
}
int main(){
TreeNode* root;
createTree(root);
cout<<"先序遍历:";
preOrder(root);
cout<<endl;
cout<<"中序遍历:";
inOrder(root);
cout<<endl;
cout<<"后序遍历:";
postOrder(root);
cout<<endl;
cout<<"叶子节点个数:"<<countLeaf(root)<<endl;
return 0;
}
```
上述代码中,`TreeNode` 结构体定义了二叉树节点的属性,包括节点的值 `val` 和左右子节点指针 `left` 和 `right`。`createTree` 函数实现了二叉树的建立,每次输入一个节点的值,如果该值为 -1,则表示该节点为空,否则新建一个节点,并递归地构建左右子树。`preOrder`、`inOrder` 和 `postOrder` 分别实现了先序、中序和后序遍历,递归地遍历节点,并输出节点的值。`countLeaf` 函数统计叶子节点的个数,如果当前节点为空,则返回 0;如果当前节点的左右子节点都为空,则返回 1;否则递归地统计左右子树的叶子节点个数并相加。
在 `main` 函数中,我们通过 `createTree` 函数建立二叉树,然后分别调用 `preOrder`、`inOrder` 和 `postOrder` 函数进行遍历,并调用 `countLeaf` 函数统计叶子节点个数。
阅读全文