📝二叉树的前序遍历
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%d", root->val);
BinaryTreePrevOrder(root->left);
BinaryTreePrevOrder(root->right);
}
📝二叉树的中序遍历
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeInOrder(root->left);
printf("%d ", root->val);
BinaryTreeInOrder(root->right);
}
📝二叉树的后序遍历
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreePostOrder(root->left);
BinaryTreePostOrder(root->right);
printf("%d ", root->val);
}
📝求二叉树的节点个数。
// 二叉树节点个数
void BinaryTreeSize(BTNode* root, int*p)
{
if (root == NULL)
{
return 0;
}
(*p)++;
BinaryTreeSize(root->left, p);
BinaryTreeSize(root->right, p);
}
【注意】
这里的p是用来记录节点的个数的,这里传的是地址。
因为我们这里采用了递归调用,每调用一次函数,那么就会建立一个函数栈帧,如果我们使用传值,局部变量p调用完一次就会被销毁,再次调用就会重建,使用的不是同一块空间,因此是无用功。所以传的是地址。
📝求二叉树叶子节点个数。
// 二叉树叶子节点个数
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层节点个数 。
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
assert(k >= 1);
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
📝单值二叉树 👉 OJ链接
【参考代码】
bool isUnivalTree(struct TreeNode* root){
if(root == NULL)
{
return true;
}
//有左孩子,且值不等
if(root->left && root->left->val != root->val)
{
return false;
}
//有右孩子,且值不等
if(root->right && root->right->val != root->val)
{
return false;
}
//再递归判断其左子树,和右子树是否等值
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
📝检查两颗树是否相同 👉 OJ链接
【参考代码】
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p == NULL && q == NULL)
{
return true;
}
//一方为空一方不为空, 不相同
else if((p == NULL && q!= NULL )||(q == NULL && p!= NULL))
{
return false;
}
else if(p->val != q->val)
{
return false;
}
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
📝对称二叉树 👉OJ链接
【参考代码】
bool _isSymmetric(struct TreeNode* root1, struct TreeNode* root2)
{
if(root1 == NULL && root2 == NULL)
{
return true;
}
if(root1 == NULL || root2 == NULL)
{
return false;
}
if(root1->val != root2->val)
{
return false;
}
return _isSymmetric(root1->left, root2->right) && _isSymmetric(root1->right, root2->left);
}
bool isSymmetric(struct TreeNode* root){
if(root == NULL)
{
return true;
}
return _isSymmetric(root->left, root->right);
}
📝 另一棵树的子树 👉OJ链接
【参考代码】
//判断是否为相同的树
bool isSametree(struct TreeNode* root1, struct TreeNode* root2)
{
if(root1 == NULL && root2 == NULL)
{
return true;
}
if(root1 == NULL || root2 == NULL)
{
return false;
}
if(root1->val != root2->val)
{
return false;
}
return isSametree(root1->left, root2->left) && isSametree(root1->right, root2->right) ;
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
if(isSametree(root, subRoot))
{
return true;
}
return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
📝构建一棵二叉树
假设#代表空格,请使用前序遍历构建起一棵二叉树
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->val = a[(*pi)++];
root->left = BinaryTreeCreate(a, pi);
root->right = BinaryTreeCreate(a, pi);
return root;
}
提示:以上是本篇文章正文内容,上面代码或案例可供参考