树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结。
这是一个树的基本结构
typedef struct node{
struct node * lchild;
struct node * rchild;
int data;//可以换成任意数据类型
}BiTNode,*BiTree;
基本接口如下
/*生成节点*/
BiTNode *MakeNode(int item,BiTNode *lchild,BiTNode *rchild)
{
BiTNode * pnode = (BiTNode *)malloc(sizeof(BiTNode));
if(pnode)
{
pnode->data = item;
pnode->lchild = lchild;
pnode->rchild = rchild;
}
return pnode;
}
/*释放节点*/
void FreeNode(BiTNode *pnode)
{
if(pnode!=NULL)
free(pnode);
}
//设置左子树
BiTree SetLChild(BiTree parent,BiTree lchild)
{
parent->lchild = lchild;
return lchild;
}
/*设置右子树*/
BiTree SetRChild(BiTree parent,BiTree rchild)
{
parent->rchild = rchild;
return rchild;
}
下面开始二叉树的操作:
1.创建二叉树
//节点数据
BiTNode * n1 = MakeNode(10,NULL,NULL);
BiTNode * n2 = MakeNode(20,NULL,NULL);
BiTNode * n3 = MakeNode(30,n1,n2);
BiTNode * n4 = MakeNode(40,NULL,NULL);
BiTNode * n5 = MakeNode(50,NULL,NULL);
BiTNode * n6 = MakeNode(60,n4,n5);
BiTNode * n7 = MakeNode(70,NULL,NULL);
//1.生成2叉树
BiTree rootTree = InitBiTree(n7);
SetLChild(rootTree, n3);
SetRChild(rootTree, n6);
2.遍历二叉树
//前序遍历
void PreOrderTraverse(BiTree pRoot)
{
if(pRoot == NULL)
return;
printf("%d,",pRoot->data); // 访问根节点
PreOrderTraverse(pRoot->lchild); // 前序遍历左子树
PreOrderTraverse(pRoot->rchild); // 前序遍历右子树
}
//中序遍历
void InOrderTraverse(BiTree pRootNode)
{
if(pRootNode == NULL)
{
return;
}
InOrderTraverse(pRootNode->lchild);
printf("%d,",pRootNode->data);
InOrderTraverse(pRootNode->rchild);
}
//后序遍历
void PostorderOrderTraverse(BiTree pRootNode)
{
if(pRootNode == NULL)
{
return;
}
PostorderOrderTraverse(pRootNode->lchild);
PostorderOrderTraverse(pRootNode->rchild);
printf("%d,",pRootNode->data);
}
调用如下
PreOrderTraverse(rootTree); printf("\n");
InOrderTraverse(rootTree); printf("\n");
PostorderOrderTraverse(rootTree); printf("\n");
log:
70,30,10,20,60,40,50,
10,30,20,70,40,60,50,
10,20,30,40,50,60,70,