C/C++实现二叉树的生成,遍历,求深度,叶子节点数

二叉树就是最多只有两个子节点,二叉树的创建可以通过递归方法来实现
二叉树的遍历方法有三种:先根遍历,中根遍历,后根遍历

先根遍历:就是先访问根节点,然后访问左子树,又访问右子树
中跟遍历:先访问左子树,再访问根节点,最后访问右子树
后根遍历:先访问左子树,再访问右子树,最后访问根

实现这三个遍历最好的方法就是使用递归方法,但是也可以使用栈来实现。

上代码

 


#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;
}

代码里面有注释,有问题欢迎指出。

发布了34 篇原创文章 · 获赞 15 · 访问量 3237

猜你喜欢

转载自blog.csdn.net/weixin_43404016/article/details/94392125