一、二叉树简单操作
1、二叉树的创建(二叉链)
a[] = {1,2,3,’#’,’#’,4,5,’#’,’#’,6,’#’,’#’,7,8,’#’,9,’#’,’#’,’#’};(‘#’代表NULL)。
2、二叉树的遍历
(1)迭代法遍历(①前序遍历②中序遍历③后序遍历)
(2)递归法遍历(①前序遍历②中序遍历③后序遍历)
(3)层序遍历。
二、完整代码
1、BinaryTree.h
#ifndef __TREE_H__
#define __TREE_H__
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<assert.h>
typedef int DataType;
typedef struct BTreeNode //树结构
{
DataType data;
struct BTreeNode *left;
struct BTreeNode *right;
}BTNode;
BTNode* CreateBTree(DataType *a,size_t *index,DataType invalid); //创建一棵二叉树
void BTreePrevOrderR(BTNode *root); //前序遍历
void BTreeInOrderR(BTNode *root); //中序遍历
void BTreeBackOrderR(BTNode *root); //后序遍历
void BTreePrevOrder(BTNode *root); //前序遍历
void BTreeInOrder(BTNode *root); //中序遍历
void BTreeBackOrder(BTNode *root); //后序遍历
void BTreeFloorOrder(BTNode *root); //层序遍历
#endif //__TREE_H__
2、BinaryTree.c
#include "Tree.h"
BTNode* BuyTreeNode(DataType x) //创建树节点
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
assert(node);
node->left = NULL;
node->right = NULL;
node->data = x;
return node;
}
BTNode* CreateBTree(DataType *a,size_t *index,DataType invalid) //创建一棵二叉树
{
BTNode *root = NULL;
if (a[*index] != invalid) //序列值不为非法值就创建左右子树
{
root = BuyTreeNode(a[*index]);
++(*index);
root->left = CreateBTree(a,index,invalid);
++(*index);
root->right = CreateBTree(a,index,invalid);
}
return root;
}
void BTreePrevOrderR(BTNode *root) //前序遍历
{
if (NULL == root) //递归结束条件
{
return;
}
printf("%d ",root->data); //根
BTreePrevOrderR(root->left); //左
BTreePrevOrderR(root->right); //右
}
void BTreeInOrderR(BTNode *root) //中序遍历
{
if (NULL == root) //递归结束条件
{
return;
}
BTreeInOrderR(root->left); //左
printf("%d ",root->data); //根
BTreeInOrderR(root->right); //右
}
void BTreeBackOrderR(BTNode *root) //后序遍历
{
if (NULL == root) //递归结束条件
{
return;
}
BTreeBackOrderR(root->left); //左
BTreeBackOrderR(root->right); //右
printf("%d ",root->data); //根
}
#include "stack.h"
void BTreePrevOrder(BTNode *root) //迭代法前序遍历
{
Stack s;
BTNode *top = NULL;
BTNode *tmp = root;
StackInit(&s);
while (StackEmpty(&s) != 0 || NULL != tmp)
{
while (NULL != tmp) //遍历左子树
{
if (NULL != tmp)
{
printf("%d ",tmp->data);
StackPush(&s,tmp); //左子树不为空则入栈
tmp = tmp->left;
}
}
top = StackTop(&s); //左子树为空,取栈顶
StackPop(&s);
tmp = top->right; //访问右子树
}
}
void BTreeInOrder(BTNode *root) //中序遍历
{
Stack s;
BTNode *top = NULL;
BTNode *tmp = root;
StackInit(&s);
while (StackEmpty(&s) != 0 || NULL != tmp)
{
while (NULL != tmp) //遍历左子树
{
if (NULL != tmp)
{
StackPush(&s,tmp); //左子树不为空则入栈
tmp = tmp->left;
}
}
top = StackTop(&s); //左子树为空,取栈顶
printf("%d ",top->data);
StackPop(&s);
tmp = top->right; //访问右子树
}
}
void BTreeBackOrder(BTNode *root) //后序遍历
{
Stack s;
BTNode *top = NULL;
BTNode *prev = NULL;
BTNode *tmp = root;
StackInit(&s);
while (StackEmpty(&s) != 0 || NULL != tmp)
{
while (NULL != tmp) //遍历左子树
{
if (NULL != tmp)
{
StackPush(&s,tmp); //左子树不为空则入栈
tmp = tmp->left;
}
}
top = StackTop(&s); //左子树为空,取栈顶
if (NULL == top->right || top->right == prev)
{
printf("%d ",top->data);
prev = top;
StackPop(&s);
}
else
tmp = top->right; //访问右子树
}
}
void BTreeFloorOrder(BTNode *root) //层序遍历
{
Queue q;
BTNode *tmp = root;
QueueInit(&q);
QueuePush(&q,tmp);
while (QueueEmpty(&q)) //取队头元素访问,并同时入队该元素的左右非空子树节点
{
BTNode *front = QueueFront(&q);
QueuePop(&q);
printf("%d ",front->data);
if (front->left)
{
QueuePush(&q,front->left);
}
if (front->right)
{
QueuePush(&q,front->right);
}
}
}
3、Test.c
#include "Tree.h"
void Test1()
{
DataType a[] = {1,2,3,'#','#',4,5,'#','#',6,'#','#',7,8,'#',9,'#','#','#'};
DataType index = 0;
BTNode *tree = CreateBTree(a,&index,'#');
BTreePrevOrderR(tree); //前序遍历
BTreeInOrderR(tree); //中序遍历
BTreeBackOrderR(tree); //后序遍历
BTreePrevOrder(tree); //非递归前序遍历
BTreeInOrder(tree); //非递归中序遍历
BTreeBackOrder(tree); //非递归后序遍历
BTreeFloorOrder(tree);//层序遍历
printf("\n");
}
int main()
{
Test1();
return 0;
}