赞
踩
树是由m(m>=0)个结点组成的有序集合,而二叉树的结点的子节点应该为n(n<=2),且严格区分左孩子结点和右孩子结点。
下面为二叉树的链式存储以及二叉树的4种遍历方式。
设有如下二叉树:
A 先序遍历: ABCDEFGHK
/ \ 中序遍历: BDCAEHGKF
B E 后序遍历: DCBHKGFEA
\ \ 层次遍历: ABECFDGHK
C F
/ /
D G
/ \
H K
C语言代码实现:
采用链式存储,递归存入的方式创建二叉树,以’#'表示空结点,运行结果如下:
实现代码:
/* tree.c */ #include "tree.h" T_node *create_tree() //创建二叉树 { char c; if((c = getchar()) != '#'){ T_node *root = (T_node *)malloc(sizeof(T_node)); if(NULL == root){//申请空间失败 printf("malloc failed!\n"); return NULL; } root->data = c; root->l_child = create_tree();//递归创建左孩子节点 root->r_child = create_tree();//递归创建右孩子节点 return root; } else{ return NULL; } } //先序遍历 void pre_traversal(T_node *tree) { if(!tree){ return; } else{ printf("%c ",tree->data); pre_traversal(tree->l_child); pre_traversal(tree->r_child); } } //中序遍历 void mid_traversal(T_node *tree) { if(!tree){ return; } else{ mid_traversal(tree->l_child); printf("%c ",tree->data); mid_traversal(tree->r_child); } } //后序遍历 void pos_traversal(T_node *tree) { if(!tree){ return; } else{ pos_traversal(tree->l_child); pos_traversal(tree->r_child); printf("%c ",tree->data); } } //层次遍历 void lev_traversal(T_node *tree) { if(tree == NULL) return; //空树返回 T_node *p,*t[32] = {0}; int front,rear; //头尾‘指针’ front = rear = 1; //下标从1开始 t[rear] = tree; while(t[front] != NULL){ printf("%c ",t[front]->data); p = t[front]; if(p->l_child != NULL){ t[++rear] = p->l_child; } if(p->r_child != NULL){ t[++rear] = p->r_child; } front++; } }
/* main.c */ #include "tree.h" int main() { T_node *t = create_tree(); printf("先序遍历:"); pre_traversal(t); puts(""); printf("中序遍历:"); mid_traversal(t); puts(""); printf("后序遍历:"); pos_traversal(t); puts(""); printf("层次遍历:"); lev_traversal(t); puts(""); return 0; }
/* tree.h */ #include <stdio.h> #include <stdlib.h> #include <string.h> #ifndef __TREE__ #define __TREE__ typedef int data_t; typedef struct tree_node{ data_t data; //数据域 struct tree_node *l_child; //指向左孩子节点 struct tree_node *r_child; //指向右孩子节点 }T_node; //创建树 T_node *create_tree(); //先序遍历 void pre_traversal(T_node *tree); //中序遍历 void mid_traversal(T_node *tree); //后序遍历 void pos_traversal(T_node *tree); //层次遍历 void lev_traversal(T_node *tree); #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。