typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
1、通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* CreatBTree(char* str, int* pi)
{
if(str[*pi]!= '#')
{
//当前节点非空,则创建当前节点
BTNode*root=(BTNode*)malloc(sizeof(BTNode));
root->_data = str[*pi];
//字符位置向后移动一个位置
++(*pi);
//创建左子树
root->_left=CreatBTree(str,pi);
//字符位置向后移动一个位置
++(*pi);
//创建右子树
root->_right=CreatBTree(str,pi);
return root;
}
else
return NULL; //如果是空节点,则返回NULL
}
2、二叉树销毁
void TreeDestory(TreeNode* root)
{
if(root=NULL)
return;
//后序销毁
TreeDestory(root->left);
TreeDestory(root->right);
free(root);
}
3、二叉树结点个数
int BinaryTreeSize(BTNode* root)
{
if(root==NULL)
return 0;
return 1+BinaryTreeSize(root->_left)+BinaryTreeSize(root->_right);
}
4、二叉树叶子结点个数
int BinaryTreeLeafSize(BTNode* root)
{
if(root==NULL)
return 0;
if(root->_left==NULL&root->_right==NULL)
return 1;
return BinaryTreeLeafSize(root->_left)+BinaryTreeLeafSize(root->_right);
}
5、二叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if(root=NULL)
return 0;
if(k==1)
return 1;
return BinaryTreeLevelKSize(root->_left,k-1)+BinaryTreeLevelKSize(root->_right,k-1);
}
6、二叉树查找值为x的结点
TreeNode* TreeFind(TreeNode* root, char x)
{
TreeNode*ret=NULL;
if(root==NULL);
return NULL;
if(root->_ch==x)
return root;
//到左树去查找,如果左树找到了,返回上一层
ret=TreeFind(root->_left,x);
if(ret)
return ret;
//如果左树未找到,再到右树去找
ret=TreeFind(root->_right,x);
if(ret)
return ret;
return NULL;
}
7、二叉树前序遍历
void _preorderTraversal(struct TreeNode* root,int* retA,int* pi)
{
if(root==NULL)
return;
retA[(*pi)++]=root->val;
_preorderTraversal(root->left,retA,pi);
_preorderTraversal(root->right,retA,pi);
}
8、 二叉树中序遍历
void _inorderTraversal(struct TreeNode* root,int* retA,int* pi)
{
if(root==NULL)
return;
_inorderTraversal(root->left,retA,pi);
retA[(*pi)++]=root->val;
_inorderTraversal(root->right,retA,pi);
}
9、二叉树后序遍历
void _postorderTraversal(struct TreeNode* root,int* retA,int* pi)
{
if(root==NULL)
return;
_postorderTraversal(root->left,retA,pi);
_postorderTraversal(root->right,retA,pi);
retA[(*pi)++]=root->val;
}
10、二叉树层序遍历
//队列实现
void TreeLevelOrder(TreeNode* root)
{
Queue q;
QueueInit(&q);
if(root!=NULL)
QueuePush(&q, root);
while (!QueueEmpty(&q))
{
TreeNode*front=QueueFront(&q);
QueuePop(&q);
printf("%c ",front->_ch);
if (front->_left)
{
QueuePush(&q, front->_left);
}
if (front->_right)
{
QueuePush(&q, front->_right);
}
QueueDestory(&q);
}
11、判断二叉树是否是完全二叉树
//走层序,所有结点都连续
int TreeComplete(TreeNode* root)
{
Queue q;
QueueInit(&q);
while (!QueueEmpty(&q))
{
TreeNode*front = QueueFront(&q);
QueuePop(&q);
if (front==NULL)
break;
QueuePush(&q,front->_left);
QueuePush(&q,front->_right);
}
//如果出到空了,就看后面有无非空,如果有,则不是完全二叉树;如果没有,则是完全二叉树
while (!QueueEmpty(&q))
{
TreeNode*front=QueueFront(&q);
QueuePop(&q);
if(front!=NULL)
return 0;
return 1;
}
}