1、二叉树:
由根节点、左树和右树构成,也可以为空。
二叉树的三种遍历方式:
前序遍历:根、左、右
中序遍历:左、根、右
后序遍历:左、右、根
创建一颗二叉树:
BTNode* BuyBTNode(BTDataType x) //创建一个节点
{
BTNode* root=(BTNode*)malloc(sizeof(BTNode));
root->_left=NULL;
root->_right=NULL;
root->_data=x;
return root;
}
BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid)//创建一棵二叉树
{
BTNode *root = NULL;
if (a[*pIndex] != invalid) //序列值不为非法值就创建左右子树
{
root = BuyBTNode(a[*pIndex]); //创建节点
++(*pIndex);
root->_left= CreateBTree(a,pIndex,invalid);
++(*pIndex);
root->_right = CreateBTree(a,pIndex,invalid);
}
return root; //返回根节点地址
}
二叉树的递归遍历:
前序:
oid BTreePrevOrder(BTNode* root)//前序
{
if(root==NULL)
return ;
else
{
printf("%d ",root->_data);//根
BTreePrevOrder(root->_left);//左
BTreePrevOrder(root->_right);//右
}
}
中序
void BTreeInOrder(BTNode* root)//中序
{
if(root==NULL)
return ;
else
{
BTreeInOrder(root->_left);//左
printf("%d ",root->_data);//根
BTreeInOrder(root->_right);//右
}
}
后序
void BTreePostOrder(BTNode* root)//后序
{
if(root==NULL)
return ;
else
{
BTreePostOrder(root->_left);//左
BTreePostOrder(root->_right);//右
printf("%d ",root->_data);//根
}
}
求二叉树节点的个数
size_t BTreeSize(BTNode* root)//求二叉树的节点个数
{
if(root==NULL)
return 0;
return BTreeSize(root->_left)+BTreeSize(root->_right)+1;
}
求二叉树的叶子树
size_t BTreeLeafSize(BTNode* root)//求二叉树的叶子数
{
if(NULL==root)
return 0;
if(root->_right==NULL&&root->_left==NULL)
return 1;
return BTreeLeafSize(root->_left)+BTreeLeafSize(root->_right);
}
求第k层节点个数
size_t BTreeKLevelSize(BTNode* root, size_t k)//求第k层节点个数
{
if (NULL == root)
{
return 0;
}
if (1 == k)
{
return 1;
}
return BTreeKLevelSize(root->_left, k - 1) + BTreeKLevelSize(root->_right, k - 1);
}
求树的深度
size_t BTreeDepth(BTNode* root) //求树的深度
{
size_t rightDepth;
size_t leftDepth;
if(root==NULL)
{
return 0;
}
leftDepth=BTreeDepth(root->_left);
rightDepth=BTreeDepth(root->_right);
return leftDepth>rightDepth ?(leftDepth+1):(rightDepth+1);//选取左右树的深度最大的那个加一
}
二叉树的查找
BTNode* BTreeFind(BTNode* root, BTDataType x)//二叉树的查找
{
BTNode* leftRet=0;
BTNode* rightRet=0;
if(NULL==root)
{
return NULL;
}
if(x==root->_data)
{
return root;
}
leftRet=BTreeFind(root->_left,x);
if(NULL!=leftRet)
{
return leftRet;
}
rightRet=BTreeFind(root->_right,x);
if(NULL!=rightRet)
{
return rightRet;
}
return NULL;
}