二叉树(二)

二叉树的基本操作

  1. 求节点个数
  2. 求叶子节点个数
  3. 求第K层节点个数
  4. 求二叉树高度
  5. 查找节点是否在树中
  6. 判断完全二叉树
  7. 求二叉树镜像
  • 求节点个数
//采用后序遍历的方式,先计算左边,在计算右边,最后加上根结点
int GetSize(BTreeNode *root)
{
    if(root == NULL)
    {
        return 0;
    }
    
    int left = GetSize(root->left);
    int right = GetSize(root->right);
    
    return left + right + 1;
}
  • 求叶子节点个数
int GetLeafSize(BTreeNode *root)
{
    if(root == NULL)
    {
        return 0;
    }
    //左右节点都为空,则为叶子节点
    if(root->left == NULL && root->right == NULL)
    {
        return 1;
    }
    int left = GetLeafSize(root->left);
    int right = GetLeafSize(root->right);
    
    return left + right;
}
  • 求第K层节点个数
int GetLevelSize(BTreeNode *root, TDataType k)
{
    //对K的值进行断言
    assert(k>=1);
    if(root == NULL)
    {
        return 0;
    }
    if(k == 1)
    {
        return 1;
    }
    int left = GetLevelSize(root->left, k-1);
    int right = GetLevelSize(root->right, k-1);
    
    return left + right;
}
  • 求二叉树高度
int GetHight(BTreeNode *root)
{
    if(root == NULL)
    {
        return 0;
    }
    //只有根节点,树的高度为1
    if(root->left == NULL && root->right == NULL)
    {
        return 1;
    }
    
    int left = GetHight(root->left);
    int right = GetHight(root->right);
    
    return (left>right)?left:right;
}
  • 查找节点是否在树中
BTreeNode * Find(BTreeNode *root, TDataType data)
{
    if(root == NULL)
    {
        return NULL;
    }
    if(root->data == data)
    {
        return root;
    }
    BTreeNode* result = Find(root->left,data);
    if(result != NULL)
    {
        return result;
    }
    result = Find(root->right,data);
    if(result != NULL)
    {
        return result;
    }
    else
    {
        return NULL;
    }
}
  • 判断完全二叉树

判断完全二叉树是根据层序遍历的思想来做的

avater

int IsCompleteTree(BTreeNode *root)
{
    Queue queue;
    QueueInit(&queue);
    BTreeNode *front;
    
    QueuePush(&queue,root);
    while(!QueueEmpty(&queue))
    {
        front = QueueFront(&queue);
        QueuePop(&queue);
        //当遇到空的时候停止
        if(front == NULL)
        {
            break;
        }
        QueuePush(&queue,root->left);
        QueuePush(&queue,root->right);
    }
    while(!QueueEmpty(&queue))
    {
        front = QueueFront(&queue);
		QueuePop(&queue);
		if(front != NULL)
		{
		    QueueDestroy(&queue);
		    return 0;
		}
    }
    QueueDestroy(&queue);
    return;
}
  • 求二叉树镜像

avater

  • 递归方式
void GetMirror(BTreeNode *root)
{
    if(root == NULL)
    {
        return;
    }
    GetMirror(root->left);
    GetMirror(root->right);
    
    BTreeNode *temp = root->left;
    root->left = root->right;
    root->right = temp;
}
  • 非递归方式(采用非递归的后序遍历)
void GetMirrorLoop(BTreeNode *root)
{
    Stack stack;
    StackInit(&stack);
	BTreeNode *cur = root;
	BTreeNode *top;
	BTreeNode *last = NULL;
	
	while(cur != NULL || !StackEmpty(&stack))
	{
	    while(cur != NULL)
	    {
	        StackPush(&stack,cur);
	        cur = cur->left;
	    }
	    top = StackTop(&stack);
	    if(top->right == NULL || top->right == last)
	    {
	        StackPop(&stack);
	        BTreeNode *temp = root->left;
            root->left = root->right;
            root->right = temp;
            last = top;
	    }
	    else
	    {
	        cur = top->right;
	    }
	}
	StackDestroy(&stack);
}
### 关于二叉树级指针的概念 在C/C++编程中,二叉树是一种常见的数据结构,用于表示层次化的节点关系。每个节点最多有两个子节点:左子节点和右子节点。而级指针是指指向指针的指针,在操作动态分配内存或者修改函数参数中的指针本身时特别有用。 #### 二叉树定义与基本操作 对于二叉树而言,通常通过结构体来定义其节点: ```c++ struct TreeNode { int val; struct TreeNode *left; // 左孩子 struct TreeNode *right; // 右孩子 }; ``` 当涉及到插入新节点、删除现有节点以及遍历整棵树的操作时,可能会遇到需要改变某个节点地址的情况,这时就需要用到级指针[^1]。 #### 使用级指针实现的方法 考虑一个简单的例子——向已有的叉查找树(Binary Search Tree, BST) 中插入一个新的数值。为了能够更新根节点的位置(即可能要创建新的根),可以传递指向根节点指针的指针给插入函数: ```cpp void insertIntoBST(TreeNode **rootRef, int newValue){ if (*rootRef == nullptr){ *rootRef = new TreeNode{newValue,nullptr,nullptr}; }else{ TreeNode* current=*rootRef; while(true){ if(newValue<current->val){ if(current->left==nullptr){ current->left=new TreeNode{newValue,nullptr,nullptr}; break; } current=current->left; } else { /* 类似处理右侧 */ ... } } } } ``` 这段代码展示了如何利用级指针`TreeNode** rootRef` 来允许被调用者更改传入的 `root` 参数所指向的对象。这使得即使是在递归或迭代过程中也可以安全有效地调整树形结构[^2]。 #### 应用场景分析 使用级指针的主要优势在于能够在不返回额外值的情况下直接修改外部作用域内的指针变量。这对于构建自平衡叉搜索树(如AVL Trees 或 Red-black trees),或是执行涉及大量结构调整的数据结构算法来说非常重要。此外,在某些情况下还可以简化接口设计并提高性能效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值