二叉搜索树相关题目

//二叉查找树的第k大节点:利用二叉搜索树的中序遍历序列是递增排序的性质,递归实现
struct BinaryTreeNode{
    int m_nValue;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
};
BinaryTreeNode* FindKthNodeCore(BinaryTreeNode* pRoot, unsigned int & k){
    BinaryTreeNode* target = nullptr;
    if (pRoot->m_pLeft != nullptr) {
        target = FindKthNodeCore(pRoot->m_pLeft, k);
    }
    if (target == nullptr){
        if (k == 1)
            target = pRoot;
        else
            --k;
    }
    if (target == nullptr && pRoot->m_pRight != nullptr){
        target = FindKthNodeCore(pRoot->m_pRight, k);
    }
    return target;
}
BinaryTreeNode* FindKthNode(BinaryTreeNode* pRoot, unsigned int k){
    if (pRoot == nullptr || k < 1)
        return nullptr;
    return FindKthNodeCore(pRoot, k);
}
//二叉树的深度:二叉树的后序遍历
//题目一:求二叉树的深度
int DepthOfTree(BinaryTreeNode* pRoot){
    if (pRoot == nullptr)
        return 0;
    int left = DepthOfTree(pRoot->m_pLeft);
    int right = DepthOfTree(pRoot->m_pRight);
    int depth = max(left, right) + 1;
    return depth;
}

//题目二:判断一棵树是否是二叉平衡树
int DepthOfNode(BinaryTreeNode* pRoot){
    if (pRoot == nullptr)
        return 0;
    int left = DepthOfNode(pRoot->m_pLeft);
    int right = DepthOfNode(pRoot->m_pRight);
    return max(left, right) + 1;
}
bool IsBalancedTree(BinaryTreeNode* pRoot){
    if (pRoot == nullptr)
        return false;
    int left = DepthOfNode(pRoot->m_pLeft);
    int right = DepthOfNode(pRoot->m_pRight);
    int depthDiff = left - right;
    if (right > left)
        depthDiff = right - left;
    if (depthDiff > 1)
        return false;
    return IsBalancedTree(pRoot->m_pLeft) && IsBalancedTree(pRoot->m_pRight);
}
//后序遍历的方法:每个节点只需要遍历一次
bool IsBalanced(BinaryTreeNode* pRoot, int& depth){
    if (pRoot == nullptr){
        depth = 0;
        return true;
    }
    int left, right;
    if (IsBalanced(pRoot->m_pLeft, left)
        && IsBalanced(pRoot->m_pRight, right)){
        int diff = left - right;
        if (diff >= -1 && diff <= 1){
            depth = max(left, right) + 1;
            return true;
        }
    }
    return false;
}
bool IsBalancedTree2(BinaryTreeNode* pRoot){
    int depth = 0;
    return IsBalanced(pRoot, depth);
}

转载于:https://www.cnblogs.com/songdanzju/p/7441971.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值