//二叉树
//以下二叉树所有接口都将以递归的形式书写
//二叉树的销毁函数要传入二级指针,比较特殊,需要谨记
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef char BTDataType;
typedef struct BinaryTreeNode {
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
BTNode*CreatTree(BTDataType *a,int *p){
if (a[*p] != "#")
{
BTNode*root = (BTNode *)malloc(sizeof(BTNode));
root->_data = a[*p];
(*p)++;
root->_left = CreatTree(a, p);
(*p)++;
root->_right = CreatTree(a, p);
return root;
}
}
/*二叉树的销毁
void BinaryTreeDestory(BTNode *root)
{//这个写法是错误的 二叉树的销毁要传二级指针
if (root)
{
BinaryTreeDestory(root->_left);
BinaryTreeDestory(root->_right);
free(root);
}
}*/
//获取二叉树的节点个数
int BinaryTreeSize(BTNode*root)
{
if (root == NULL)
return 0;
return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;
}
//二叉树的前序遍历
void PreOrderTraverse(BTNode*root)//二叉树的先序遍历
{
if (root == NULL)
return;
printf("%c ", root->_data);
PreOrderTraverse(root->_left);
PreOrderTraverse(root->_right);
}
//二叉树的中序遍历
void InOrderTraverse(BTNode *root)//二叉树的中序遍历
{
if (root == NULL)
return;
InOrderTraverse(root->_left);
printf("%c ", root->_data);
InOrderTraverse(root->_right);
}
//二叉树的后序遍历
void PostOrderTraverse(BTNode *root)//后序遍历
{
if (root == NULL)
return;
PostOrderTraverse(root->_left);
PostOrderTraverse(root->_right);
printf("%c ", root->_data);
}
//二叉树的节点个数
int BinaryTreeSize(BTNode*root)
{
if (root == NULL)return 0;
return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
//求二叉树的叶子节点个数
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);
}
//求二叉树第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);
}
//求二叉树的深度
int maxDepth(struct TreeNode*root)
{//左右根 很明显的后序遍历
if (root == NULL)
return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}