树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。
要学好二叉树,要对递归的技巧有一定的掌握,需要平时的积累吧。
接下来为大家介绍一下创建二叉树和遍历二叉树
首先创建一个二叉树的结点的结构体
typedef struct tree
{
int data; //定义一个树节点的结构体,这里我把树里面的数据简单的定义为int型的data
struct tree *l,*r;
}TREE;
创建二叉树结点的函数
TREE* create_node(int data) //创建树的结点,返回这个结点的地址
{
TREE* root = malloc(sizeof(TREE)); //给结点在堆里开辟一个空间
root->data = data; //给结点赋数据
root->l = root->r = NULL;
return root;
}
创建一个二叉树的函数
TREE* create_tree(int n) //创建一个简单的二叉树,返回根节点的地址
{
TREE *root = create_node(n);
if(2*n<10)
root->l=create_tree(2*n);
if(2*n+1<10)
root->r=create_tree(2*n+1);
return root;
}
接下来就是遍历二叉树了
首先给大家写出先序遍历的代码。
void show_tree_pre(TREE *root) //先序遍历,就是将要操作树的代码写在递归的前面
{
if(root == NULL) //递归出口
return;
printf("%d-",root->data); //操作:打印结点里面的数据
show_tree_pre(root->l); //先序遍历左子树
show_tree_pre(root->r); //先序遍历右子树
}
中序遍历
void show_tree_mid(TREE *root) //中序遍历,就是将要操作树的代码写在两条递归代码的中间
{
if(root == NULL)
return;
show_tree_mid(root->l);
printf("%d-",root->data); //与先序同理
show_tree_mid(root->r);
}
后序遍历
void show_tree_post(TREE *root) //后续遍历
{
if(root == NULL)
return;
show_tree_post(root->l);
show_tree_post(root->r);
printf("%d-",root->data);
}
以上就是二叉树的三种基本遍历方式。
下面写出主函数
int main()
{
TREE *root = create_tree(1);
show_tree_pre(root);
puts("");
show_tree_mid(root);
puts("");
show_tree_post(root);
puts("");
return 0;
}
输出结果为
1-2-4-8-9-5-3-6-7-
8-4-9-2-5-1-6-3-7-
8-9-4-5-2-6-7-3-1-
终结一下,先序就是根->左子树->右子树
中序则是左子树->根->右子树
后序是 左子树->右子树->根
以上面三种方式递归,可以遍历整个二叉树