二叉树的遍历:是指从根节点出发,按照某种次序依次访问二叉树中的所有结点。
二叉树遍历一共又有四种:
1.前序遍历
2.后序遍历
3.中序遍历
4.层序遍历
口诀:
中序遍历:
左根右
中序遍历:若树为空,则空操作返回,否则从根节点开始,(注意并不是先访问根节点)中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树。
首先我们访问的是最左的左子树是H,然后访问这个最左左子树的根节点D,然后访问他的右子树I, 然后呢 我们 看B ,D是B的左子树吧,我们就可以把D H(D的左子树)I(D的右子树),这三个看成一个整体 也就是B的左子树,所以返回B,然后返回B的右子树E,然后E的左子树没有,那么我们返回E的右子树 也就是J,然后对于B来说A是根节点,我们可以把A左侧B以下所有的看成一个整体,左侧已经全部遍历完成了,那么我们要遍历A这个根节点,然后要访问右侧最左边的左子树,结果啥也没有,就是K左侧没有 ,那么根据中序遍历规则,我们应该访问的是根节点,根节点访问完毕后,网文的是右子树K,然后F K(右子树)我们把这俩个看成一个整体,也就是C的左边全部访问完了,那么C作为根节点应该遍历出来,所以下一个遍历的字母就是C,然后呢就是右子树G.
H D I B E J A F K C G
8 6 5 7
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* left;
struct node* right;
} Node;
//先序遍历
void preorder(Node* node){
if(node !=NULL){
printf("%d",node -> data);
preorder(node -> left);
printf("%d",node -> data);
preorder(node -> right);
}
}
//中序遍历
void inorder(Node* node)
{
if(node!=NULL){
inorder(node -> left);
printf("%d\n",node ->data);
inorder (node -> right);
}
}
int main(){
Node n1;
Node n2;
Node n3;
Node n4;
n1.data = 5;
n2.data=6;
n3.data =7;
n4.data=8;
n1.left = &n2;
n1.right = &n3;
n2.left =&n4;
n2.right=NULL;
n3.left =NULL;
n3.right =NULL;
n4.left=NULL;
n4. right=NULL;
inorder(&n1);
}