二叉树的建立
例:
通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct BNode
{
struct BNode* _left;
struct BNode* _right;
DataType _data;
}Node;
Node* creatBinaryTree(DataType arr[], int* idx)
{
if (arr[*idx] == '#')
{
(*idx)++;
return NULL;
}
Node* root = (Node*)malloc(sizeof(Node));
// 根左右
root->_data = arr[*idx];
(*idx)++;
root->_left = creatBinaryTree(arr, idx);
root->_right = creatBinaryTree(arr, idx);
return root;
}
//前序遍历
void preOrder(Node* root)
{
if (root)
{
//根 左 右
printf("%c\n", root->_data);
preOrder(root->_left);
preOrder(root->_right);
}
}
//中序遍历
void inOrder(Node* root)
{
if (root)
{
//左 根 右
inOrder(root->_left);
printf("%c\n", root->_data);
inOrder(root->_right);
}
}
//后序遍历
void postOrder(Node* root)
{
if (root)
{
//左 右 根
postOrder(root->_left);
postOrder(root->_right);
printf("%c\n", root->_data);
}
}
//求节点个数
//如果是空树,则节点个数为0
//节点个数为左子树的节点个数+右子树的节点个数+1
int bTreesize(Node* root)
{
if (root == NULL)
return 0;
//左节点个数+右节点个数+1
return bTreesize(root->_left) + bTreesize(root->_right) + 1;
}
//求树的高度
int bTreeHeight(Node* root)
{
if (root == NULL)
return 0;
int left = bTreeHeight(root->_left);
int right = bTreeHeight(root->_right);
//高度=max(左右子树高)+1
return left > right ? left + 1 : right + 1;
}
//求叶子结点个数
//空节点:0个
//叶子结点:1个
//非叶子节点:左+右
int bTreeLeafsize(Node* root)
{
//空树
if (root == NULL)
return 0;
//叶子结点
if (root->_left == NULL && root->_right == NULL)
{
return 1;
}
//非叶子节点
return bTreeLeafsize(root->_left) + bTreeLeafsize(root->_right);
}
//求k层节点个数
//第k层节点个数=左右子树第k-1层的和
int bTreekSize(Node* root, int k)
{
if (root == NULL)
return 0;
if (k == 1)
return 1;
return bTreekSize(root->_left, k - 1) + bTreekSize(root->_right, k - 1);
}
//二叉树查找值为x的点
Node* bTreeFind(Node* root, char ch)
{
if (root)
{
if (root->_data == ch)
return root;//查找是否为根节点
Node* node = bTreeFind(root->_left, ch);
if (node)//查找是否为左子数
return node;
else
return bTreeFind(root->_right, ch);//如果不是左子树则为右子树
}
return NULL;//为空树
}
//二叉树销毁
void bTreeDestory(Node** root)
{
if (*root)
{
bTreeDestory(&((*root)->_left));
bTreeDestory(&((*root)->_right));
free(*root);
root = NULL;
}
}