一、创建一个固定的树
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int nValue;
struct node *pLeft;
struct node *pRight;
}BinaryTree;
BinaryTree *CreateBinaryTree()
{
BinaryTree *pRoot = NULL;
//根
pRoot = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->nValue = 1;
//根的左
pRoot->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->nValue = 2;
//左的左
pRoot->pLeft->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->pLeft->nValue = 4;
pRoot->pLeft->pLeft->pLeft = NULL;
pRoot->pLeft->pLeft->pRight = NULL;
//左的右
pRoot->pLeft->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pLeft->pRight->nValue = 5;
pRoot->pLeft->pRight->pLeft = NULL;
pRoot->pLeft->pRight->pRight = NULL;
//根的右
pRoot->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pRight->nValue = 3;
//右的左
pRoot->pRight->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
pRoot->pRight->pLeft->nValue = 6;
pRoot->pRight->pLeft->pLeft = NULL;
pRoot->pRight->pLeft->pRight = NULL;
pRoot->pRight->pRight = NULL;
return pRoot;
}
在创建函数中将左右孩子都malloc出来无孩子的结点其指向左孩子和指向右孩子的指针必须赋值为空
先讲创建方法2之前我先介绍一下树的遍历
树的遍历:
先序遍历
先序遍历(前序遍历) 根 左 右 上图树的先序遍历为 1,2,4,5,3,6
说明:从根结点开始(根,左,右) 输出根 找到根的左孩子 这时可以将其左孩子当成根结点并且重复以上操作
中序遍历 左 右 根 上图树的中序遍历为 4,2,5,1,6,3
说明:从根节点开始(左右根)找到根的左孩子 将其左孩子当成根然后重复以上操作
后序遍历:左 右 根 上图的树的后序遍历为 4,5,2,6,3,1
说明:从根节点开始(左右根)找到跟的左 重复以上操作
创建方法2:
利用先序遍历的方法(递归)创建二叉树
void CreateBiTree(BinaryTree **pTree)
{
int nNum;
scanf("%d",&nNum);
if(nNum == 0)return;
*pTree = (BinaryTree*)malloc(sizeof(BinaryTree));
(*pTree)->nValue = nNum;
(*pTree)->pLeft = NULL;
(*pTree)->pRight = NULL;
CreateBiTree(&((*pTree)->pLeft));
CreateBiTree(&((*pTree)->pRight));
}
规则:如果当前结点没有左孩子则输入零 没有右孩子也要输入零
二叉树的遍历
递归方法实现二叉树的遍历:
先序:
void PreOrderTraversal(BinaryTree *pTree)
{
if(pTree == NULL)return;
//根
printf("%d ",pTree->nValue);
//左
PreOrderTraversal(pTree->pLeft);
//右
PreOrderTraversal(pTree->pRight);
}
中序:
void InOrderTraversal(BinaryTree *pTree)
{
if(pTree == NULL)return;
//左
InOrderTraversal(pTree->pLeft);
//根
printf("%d ",pTree->nValue);
//右
InOrderTraversal(pTree->pRight);
}
后序:
void LastOrderTraversal(BinaryTree *pTree)
{
if(pTree == NULL)return;
//左
LastOrderTraversal(pTree->pLeft);
//右
LastOrderTraversal(pTree->pRight);
//根
printf("%d ",pTree->nValue);
}