普通二叉树增删查改没什么价值(用来存数据太复杂了)
在普通二叉树的基础之上增加一些性质才有意义,例如:搜索二叉树(最多查找高度次)。
那么普通二叉树不关注增删查改,它关注遍历结构
目的:1,为以后学习更有用的树打基础。2,很多oj题有普通二叉树
因为二叉树增删查改太复杂,所以我们直接创建一个树
链式二叉树建立
BTNode* BuyNode(BTDataType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node==NULL)
{
printf("malloc fail");
exit(-1);
}
node->data = x;
node->left = node->right = NULL;
return node;
}
BTNode* CreatBinaryTree()
{
BTNode* nodeA = BuyNode('A');
BTNode* nodeB = BuyNode('B');
BTNode* nodeC = BuyNode('C');
BTNode* nodeD = BuyNode('D');
BTNode* nodeE = BuyNode('E');
BTNode* nodeF = BuyNode('F');
BTNode* nodeG = BuyNode('G');
nodeA->left = nodeB;
nodeA->right = nodeC;
nodeB->left = nodeD;
nodeC->left = nodeE;
nodeC->right = nodeF;
nodeF->right = nodeG;
return nodeA;
}
前序,中序,后续遍历
void PrevOrder(BTNode* root)
{
if (root == NULL)
{
return NULL;
}
printf("%c ", root->data);
PrevOrder(root->left);
PrevOrder(root->right);
}
void InOrder(BTNode* root)
{
if (root == NULL)
{
return NULL;
}
InOrder(root->left);
printf("%c ", root->data);
InOrder(root->right);
}
void PostOrder(BTNode* root)
{
if (root == NULL)
{
return NULL;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%c ", root->data);
}
节点个树
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right) + 1;
}
叶子节点个树
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);
}
转换成求左右子树第k-1层的节点个数
二叉树深度
int BinaryTreeDepth(BTNode* root)
{
if (root == NULL)
{
return 0;
}
int rightdepth = BinaryTreeDepth(root->right);
int leftdepth = BinaryTreeDepth(root->left);
return rightdepth > leftdepth ? rightdepth+1 : leftdepth+1;
}
将左右子树深度保存起来避免多次调用浪费堆栈
查找
BTNode* TreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
BTNode* left = TreeFind(root->left,x );
if (left)
{
return left;
}
BTNode* right = TreeFind(root->right,x );
if (right)
{
return right;
}
return NULL;
}
定义left是为了如果左树已经找到了就可以避免再去找右树算是一种优化