zoukankan      html  css  js  c++  java
  • 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

    将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作:

    1、定义树的结构体:

    1 typedef struct TreeNode{
    2     int data;
    3     struct TreeNode *left;
    4     struct TreeNode *right; 
    5 }TreeNode;

    2、创建根节点:

     1 TreeNode *creatRoot(){
     2     TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode));
     3     if(NULL==root){
     4         printf("CreatRoot is failing!
    ");
     5         return NULL;
     6     }
     7     root->left=NULL;
     8     root->right=NULL;
     9     printf("Input the data of root!
    ");
    10     scanf("%d",&root->data);
    11     printf("Root created!
    ");
    12     return root;
    13 } 

    3、申请了空间一定要记得释放空间,否则后果不堪设想

    1 void clearTree(TreeNode * root){
    2     if(root){
    3         clearTree(root->left);
    4         clearTree(root->right);
    5         free(root);
    6     }
    7 }

    4、选择插入的节点是根节点的左孩子还是右孩子

     1 void addSubTreeNode(TreeNode* root,TreeNode*node,int select){
     2     if(NULL==root){
     3         printf("Root is NULL
    ");
     4         return ;
     5     }
     6     switch(select){
     7         case 1:
     8             if(root->left){
     9                 printf("The root has left subtree!
    ");
    10                 return ;
    11             }else{
    12                 root->left=node;
    13                 break;
    14             }
    15         case 2:
    16                 if(root->right){
    17                 printf("The root has right subtree!
    ");
    18                 return ;
    19             }else{
    20                 root->right=node;
    21                 break;
    22             }
    23         default:
    24             printf("The input of select is wrong!
    ");
    25     }
    26 }

    5、二叉树的前序、中序、后序遍历

     1 void DLR(TreeNode * root){
     2     if(NULL==root)
     3     return;
     4     printf("The First root input %d
    ",root->data);
     5     DLR(root->left);
     6     DLR(root->right);
     7 }
     8 
     9 void LDR(TreeNode * root){
    10     if(NULL==root)
    11     return;
    12     LDR(root->left);
    13     printf("The Middle root input %d
    ",root->data);
    14     LDR(root->right);
    15 }
    16 
    17 void LRD(TreeNode * root){
    18     if(NULL==root)
    19     return;
    20     LRD(root->left);
    21     LRD(root->right);
    22     printf("The Last root input %d
    ",root->data);
    23 }

    6、求二叉树的深度

     1 int lengthTree(TreeNode *root){
     2     int lenLeft,lenRight;
     3     if(NULL==root)
     4     return 0;
     5     else{
     6         lenLeft=lengthTree(root->left);
     7         lenRight=lengthTree(root->right);
     8         if(lenLeft<lenRight)
     9         return lenRight+1;
    10         else
    11         return lenLeft+1;
    12     }
    13 }

    7、查找节点,这里是为了初始化构建二叉树时选择的函数,目的是找出你要插入节点的父亲节点

     1 TreeNode *treeFind(TreeNode *node,int number){
     2     TreeNode *p;
     3     if(NULL==node)
     4     return NULL;
     5     else{
     6         if(node->data==number){
     7             return node;
     8         }else{
     9             if(p=treeFind(node->left,number)){
    10                 printf("Parent found!
    ");
    11                 return p;
    12             }
    13             
    14             else if(p=treeFind(node->right,number)){
    15                 printf("Parent found!
    ");
    16                 return p;
    17             }
    18             else
    19             return NULL;
    20         }
    21     }
    22 }

    8、找到父亲节点后,选择是插入做孩子还是右孩子

     1 void addNode(TreeNode *root){
     2     TreeNode *node,*parent;
     3     int number,select;
     4     printf("Please input the parent data!
    ");
     5     scanf("%d",&number);
     6     parent=treeFind(root,number);
     7     if(NULL==parent){
     8         printf("parent is not found!
    ");
     9         return ;
    10     }
    11             printf("Please choice the operation: 0 Exit; 1 insert left subtree; 2 insert right subtree!
    ");
    12             scanf("%d",&select);
    13             if(select==0)
    14             return ;
    15             if(node=(TreeNode*)malloc(sizeof(TreeNode))){
    16                 printf("Please input the data of BinTreeData that you want to insert!
    ");
    17                 scanf("%d",&node->data);
    18                 node->left=NULL;
    19                 node->right=NULL;
    20                 switch(select){
    21                     case 1:
    22                         addSubTreeNode(parent,node,1);
    23                         break;
    24                     case 2:
    25                         addSubTreeNode(parent,node,2);
    26                         break;
    27                 }
    28             }
    29 }

    9、二叉树的层次遍历

     1 void levelFind(TreeNode * root){
     2     TreeNode *node;
     3     TreeNode *Queue[MAX];
     4     int head,tail;
     5     head=tail=0;
     6     if(root==NULL){
     7         printf("Queue is empty!
    ");
     8         return ;
     9     }
    10     if((tail+1)%MAX!=head)
    11         Queue[tail++]=root;
    12     else
    13         printf("Queue is full!
    ");
    14     if(head!=tail)
    15         node=Queue[head++];
    16     else
    17         printf("Queue is empty!
    ");
    18     printf("The bintree level find is: 
    ");
    19     while(NULL!=node){
    20         printf("%d  ",node->data);
    21         if(node->left!=NULL){
    22             Queue[tail++]=node->left;
    23         }
    24         if(node->right!=NULL){
    25             Queue[tail++]=node->right;
    26         }
    27         if(head==tail){
    28             printf("Queue is empty!
    ");
    29             return;
    30         }
    31         node=Queue[head++];
    32     }
    33 }

    10、主函数

     1 int main(){
     2     TreeNode *root=NULL;
     3     int n;
     4     do{
     5         printf("1 set root, 2 addNode, 3 the First root input, 4 the Middle root input, 5 the last root input, 6 according to level find, 7 caculate the depth, 0 exit!
    ");
     6         scanf("%d",&n);
     7         switch(n){
     8             case 0:
     9                 break;
    10             case 1:
    11                 if(NULL==root)
    12                 root=creatRoot();
    13                 else
    14                 printf("The root is exist!
    ");
    15                 break;
    16             case 2:
    17                 addNode(root);
    18                 break;
    19             case 3:
    20                 DLR(root);
    21                 break;
    22             case 4:
    23                 LDR(root);
    24                 break;
    25             case 5:
    26                 LRD(root);
    27                 break;
    28             case 6:
    29                 levelFind(root);
    30                 break;
    31             case 7:
    32             printf("the depth of tree is %d
    ",lengthTree(root));
    33                 break;
    34         }
    35     }while(n!=0);
    36     clearTree(root);
    37     printf("Tree are cleared all!
    ");
    38     getch();
    39     return 0;
    40     
    41 }
  • 相关阅读:
    ue父子组件的数据传递示例
    vue.js 组件之间传递数据
    Vue2.0子同级组件之间数据交互
    assets 和static的区别
    Vue中src属性绑定的问题
    css3设置背景图片的大小
    如何在HTML中插入空格
    css背景图片的设置
    vue动态组件 互相之间传输数据 和指令的定义
    webservice的优缺点
  • 原文地址:https://www.cnblogs.com/hoojjack/p/4547896.html
Copyright © 2011-2022 走看看