二叉树就是最多只有两个子节点,二叉树的创建可以通过递归方法来实现
二叉树的遍历方法有三种:先根遍历,中根遍历,后根遍历
先根遍历:就是先访问根节点,然后访问左子树,又访问右子树
中跟遍历:先访问左子树,再访问根节点,最后访问右子树
后根遍历:先访问左子树,再访问右子树,最后访问根
实现这三个遍历最好的方法就是使用递归方法,但是也可以使用栈来实现。
上代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
#include <stack>
using namespace std;
typedef struct treeNode{
char date;
struct treeNode *leftChild;
struct treeNode *rightChild;
}treeNode, *tree;
typedef struct Node
{
tree btnode;
bool isfirst;
}Node,*node;
//创建二叉树
void CreatTree(tree *root){
char date;
scanf("%c",&date);
getchar();
if(date == '#'){
*root = NULL;
}
else{
*root = (treeNode *)malloc(sizeof(treeNode));
(*root)->date = date;
printf("请输入%c的左子树\n",date);
CreatTree(&(*root)->leftChild);
printf("请输入%c的右子树\n",date);
CreatTree(&(*root)->rightChild);
}
}
//先序遍历二叉树 用递归实现
//void Preorder_traversal(tree root){
// if(root != NULL){
// printf("%c",root->date);
// Preorder_traversal(root->leftChild);
//Preorder_traversal(root->rightChild);
//}
// }
//先序遍历二叉树 用栈实现
void Preorder_traversal(tree root){
if(root == NULL){
return ;
}
tree p = root;
stack<tree>s;
while (p != NULL || !s.empty())
{
while (p != NULL)
{
s.push(p);
cout << p->date << " "; //第一次遇见的时候输出
p = p->leftChild;
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->rightChild;
}
}
}
int QueryNode(tree root,char date){
int flag = 0;
if(root == NULL){
return flag;
}
stack<tree>s;
tree p = root;
while (p != NULL || !s.empty())
{
while (p != NULL)
{
s.push(p);
if(p->date == date){
flag = 1;
}
p = p->leftChild;
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->rightChild;
}
}
return flag;
}
//叶子节点数
int StatisticalLeaves(tree root){
int leaves = 0;
if(root == NULL){
return 0;
}
else if(root->leftChild==NULL && root->rightChild==NULL){
return 1;
}
else
leaves = StatisticalLeaves(root->leftChild) + StatisticalLeaves(root->rightChild);
return leaves;
}
//求树的深度
int Deeptree(tree root){
int deep = 0;
if(root){
int left_deep = Deeptree(root->leftChild);
int right_deep = Deeptree(root->rightChild);
if(left_deep>=right_deep){
deep = left_deep;
}else
deep = right_deep;
}
return deep+1;
}
int main()
{
//ABC##DE#G##F###
tree root = NULL;
int deep;
char p;
int flag;
int note;
printf("........................功能列表...................\n");
printf(".............. 创建二叉树 ................\n");
printf(".............. 遍历二叉树 ................\n");
printf(".............. 节点查找 ................\n");
printf(".............. 叶子节点数 ................\n");
printf(".............. 树的深度 ................\n");
CreatTree(&root);
printf("........先序遍历二叉树\n");
Preorder_traversal(root);
printf("........输入查找结点\n");
scanf("%c",&p);
getchar();
flag = QueryNode(root,p);
if(flag==1){
printf("........存在节点\n");
}else{
printf("........不存在节点\n");
}
printf("........叶子节点数%d\n",StatisticalLeaves(root));
printf(".......树的深度%d\n",Deeptree(root));
return 0;
}
代码里面有注释,有问题欢迎指出。