5)二叉树

Posted 小油菜123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5)二叉树相关的知识,希望对你有一定的参考价值。

1)二叉树的遍历“

        先序遍历-->DLR

        中序遍历--》LDR

        后序遍历”--->LRD

   L就是左子树   R就是右子树   D就是根部节点(但是需要牢记 对每一个节点的查看都是 “”“先左后右”)

 

2)基础补充

  

      

 

3)下面是案例来讲解  怎么遍历:
  

        我们拿这张图举例子:

                  

 

       首先讲解 先序遍历:

                就是先根 再左  再右-->A,然后是A的左子树那么就是B所代表的树,但是B还是一个树  所以还是按照DLR,就是B,下面该是B的左子树了,但是B的左子树是空的,所以接下来就是B的右子树,也就是C那棵树,但是C韩式一棵树,还得按照DLR顺序,也就是CDE,然后回去  该A的右子树了,是F代表的子树,但是F还是一棵树,所以 就是F,他的左子树没有,该是G子树了,GH

                整个顺序就是:ABCDEFGH

      

      下面就是中序遍历,其实和先序遍历的结果一样,只不过按照的顺序是LDR    --->结果最终是BDCEAFHG

      后序遍历--->结果是  就是LRD    ---->DECBHGFA

 

4)代码编写:

     简单代码展示:
  

 1 #include<iostream>
 2 #include<string>
 3 #include<stdlib.h>
 4 
 5 
 6 using namespace std;
 7 //二叉树节点
 8  typedef struct node
 9  {
10     char ch;
11     struct node* Lchild;
12     struct node* Rchild;
13  }NODE,*PNODE;
14 
15  //下面是遍历
16 
17  void Recursion(PNODE root)
18  {
19     if(root==NULL)
20     {
21     return ;
22     
23     }
24     ////先是先序遍历,先访问根
25     //cout<<root->ch<<endl;
26     ////然后遍历左子树
27     //Recursion(root->Lchild);
28     ////然后遍历他的右子树
29     //Recursion(root->Rchild);
30 
31             ////中序
32             //Recursion(root->Lchild);
33             //cout<<root->ch<<endl;
34             //////然后遍历左子树
35             ////
36             //////然后遍历他的右子树
37             //Recursion(root->Rchild);
38     //后序遍历
39         //然后遍历左子树
40     Recursion(root->Lchild);
41         //然后遍历他的右子树
42     Recursion(root->Rchild);
43         //
44         cout<<root->ch<<endl;
45     
46             
47             
48             
49 
50  }
51  void CreateBInaryTree()
52  {
53      //创建节点
54      NODE no1={\'A\',NULL,NULL};
55      NODE no2={\'B\',NULL,NULL};
56      NODE no3={\'C\',NULL,NULL};
57      NODE no4={\'D\',NULL,NULL};
58      NODE no5={\'E\',NULL,NULL};
59      NODE no6={\'F\',NULL,NULL};
60      NODE no7={\'G\',NULL,NULL};
61      NODE no8={\'H\',NULL,NULL};
62 
63      //建立节点关系
64      no1.Lchild=&no2;
65      no1.Rchild=&no6;
66      no2.Rchild=&no3;
67      no3.Lchild=&no4;
68      no3.Rchild=&no5;
69      no6.Rchild=&no7;
70      no7.Lchild=&no8;
71 
72 
73      Recursion(&no1);
74      
75  }
76 
77  int main()
78  {
79     
80      CreateBInaryTree();
81 
82 
83 
84      system("pause");
85      return 0;
86  }

 

 5)获得子节点数目:

 

  

 1 #include<iostream>
 2 #include<string>
 3 #include<stdlib.h>
 4 
 5 
 6 using namespace std;
 7 //二叉树节点
 8  typedef struct node
 9  {
10     char ch;
11     struct node* Lchild;
12     struct node* Rchild;
13  }NODE,*PNODE;
14 
15  //下面是遍历
16 static int lnum=0;
17  void Recursion(PNODE root)
18  {
19 
20      if(root==NULL)
21     {
22     return ;
23     
24     }
25      if(root->Lchild==NULL&&root->Rchild==NULL)
26      {
27         lnum++;
28      }
29     ////先是先序遍历,先访问根
30     //cout<<root->ch<<endl;
31     ////然后遍历左子树
32     //Recursion(root->Lchild);
33     ////然后遍历他的右子树
34     //Recursion(root->Rchild);
35 
36             ////中序
37             //Recursion(root->Lchild);
38             //cout<<root->ch<<endl;
39             //////然后遍历左子树
40             ////
41             //////然后遍历他的右子树
42             //Recursion(root->Rchild);
43     //后序遍历
44         //然后遍历左子树
45     Recursion(root->Lchild);
46         //然后遍历他的右子树
47     Recursion(root->Rchild);
48         //
49         cout<<root->ch<<endl;
50     
51             
52             
53             
54 
55  }
56 
57  void CreateBInaryTree()
58  {
59     
60      //创建节点
61      NODE no1={\'A\',NULL,NULL};
62      NODE no2={\'B\',NULL,NULL};
63      NODE no3={\'C\',NULL,NULL};
64      NODE no4={\'D\',NULL,NULL};
65      NODE no5={\'E\',NULL,NULL};
66      NODE no6={\'F\',NULL,NULL};
67      NODE no7={\'G\',NULL,NULL};
68      NODE no8={\'H\',NULL,NULL};
69 
70      //建立节点关系
71      no1.Lchild=&no2;
72      no1.Rchild=&no6;
73      no2.Rchild=&no3;
74      no3.Lchild=&no4;
75      no3.Rchild=&no5;
76      no6.Rchild=&no7;
77      no7.Lchild=&no8;
78 
79 
80      Recursion(&no1);
81      
82  }
83 
84  int main()
85  {
86     
87      CreateBInaryTree();
88 
89 
90      cout<<"~~~~~~~~~~~~~"<<endl;
91      cout<<lnum<<endl;
92      system("pause");
93      return 0;
94  }

 

 

        

以上是关于5)二叉树的主要内容,如果未能解决你的问题,请参考以下文章

5.根据前序和中序得到二叉树代码实现,根据中序和后序得到二叉树代码实现(JavaScript版)

数据结构 二叉树

算法与数据结构二叉树的顺序存储代码

C语言数据结构“遍历二叉树”

5.5树和二叉树——二叉树的层次遍历算法

剑指 Offer 34. 二叉树中和为某一值的路径附完整可运行代码