关于#c++#的问题,如何解决?

除嵌套括号方式显示二叉排序树以外,增加倒立的树的形式显示。下面的代码已经有嵌套括号方式,求补充“倒立的树的形式显示二叉排序树”代码

#include 

#include 
#include 
#include     //引用头文件,不需要声明名字空间
#define ENDKEY 0
using namespace std;
typedef int KeyType;

typedef struct  node
{
    KeyType  key ; /*关键字的值*/
    struct node  *lchild,*rchild;/*左右指针*/
}BSTNode, *BSTree;



void InsertBST(BSTree *bst, KeyType key)
/*若在二叉排序树中不存在关键字等于key的元素,插入该元素*/
{ 
    BSTree s;
    if (*bst == NULL)/*递归结束条件*/
    {
        s=(BSTree)malloc(sizeof(BSTNode));/*申请新的结点s*/
        s-> key=key;
        s->lchild=NULL; 
        s->rchild=NULL;
        *bst=s;
    }
    else 
        if (key < (*bst)->key)
            InsertBST(&((*bst)->lchild), key);/*将s插入左子树*/
        else 
            if (key > (*bst)->key)
                InsertBST(&((*bst)->rchild), key); /*将s插入右子树*/
}

void  CreateBST(BSTree  *bst)
/*从键盘输入元素的值,创建相应的二叉排序树*/
{ 
    KeyType key;
    *bst=NULL;
    scanf("%d", &key);
    while (key!=ENDKEY)   /*ENDKEY为自定义常量*/
    {
        InsertBST(bst, key);
        scanf("%d", &key);
    }
}

void  PreOrder(BSTree root) 
/*先序遍历二叉树, root为指向二叉树根结点的指针*/
{
    if (root!=NULL)
    {
        printf("%d  ",root->key);  /*输出结点*/
        PreOrder(root->lchild);  /*先序遍历左子树*/
        PreOrder(root->rchild);  /*先序遍历右子树*/
    }
}



//查找的递归算法
BSTNode *SearchBST(BSTree root, int k){
    if(!root){
        printf("查找失败");
    }
    else{
        if(root->key == k){
            //return root;
            printf("%d  ",root->key);
        }
        else if(k < root->key){
            printf("%d  ",root->key);
            SearchBST(root->lchild, k);
        }
        else if(k > root->key){
            printf("%d  ",root->key);
            SearchBST(root->rchild, k);
        }
    }
    
}
/*
//查找的非递归算法            (ps:适用于查找存在于该二叉排序树的结点)
BSTNode *SearchBST(BSTree root, int k){
    BSTNode *p = root;
    while(p!=NULL && p->key!=k){
        printf("%d",p->key);
        if(k < p->key){
            p = p->lchild;
            //printf("%d",p->key);
        }
        else{
            p = p->rchild;
            //printf("%d",p->key);
        }
        
    }
    
    printf("%d",p->key);
}

*/
//计算数的高度
int height(BSTree T)//将左子树和右子树的高度比大小,大的那边子树的高度加1,就是数的高度
{
    int max;
    if(T==NULL)//一定要设置好这样的递归出口
        return 0;
    else
    {
        int left_h=height(T->lchild);
        int right_h=height(T->rchild);
        int max=left_h;
        if(right_h>max)
            max=right_h;
        return max+1;
    }
}

//二叉树的的嵌套括号表示:
void Show(BSTree T)
{
    if(T)
    {
        cout<key;       //为了将c++和c区分开,规定c++的头文件都没有后缀.h,当时用iostream的时候(预定义的对象 cin 和cout是 iostream 类的一个实例),就需要用namespace std来配合,才能使用cin或cout的这种标识符。
        if(T->lchild||T->rchild)
        {
            cout<<"(";
            Show(T->lchild);
            cout<<",";
            Show(T->rchild);
            cout<<")";
        }
    }
}

void Succlength(BSTree T,int &sumlen,int &m,int level) //求查找成功总的比较次数sumlen和情况数m
{
    if (T==NULL) return;    //空树直接返回
    m++;
    sumlen+=level;
    Succlength(T->lchild,sumlen,m,level+1);
    Succlength(T->rchild,sumlen,m,level+1);
    
}
double prSucclength(BSTree T)    //输出查找成功总的比较次数sumlen
{
    int sumlen=0,m=0;
    Succlength(T,sumlen,m,1);
    printf("查找成功的比较次数:%d\n",sumlen);
}
double ASLsucc(BSTree T)    //求查找成功情况下的平均查找长度
{
    int sumlen=0,m=0;
    Succlength(T,sumlen,m,1);
    return sumlen*1.0/m;
}


void Unsucclength(BSTree T,int &sumlen,int &m,int level) //求查找失败总的比较次数sumlen和情况数m
{
    if (T==NULL)        //空指针对应外部节点
    {
        m++;
        sumlen+=level-1;
        return;
    }
    Unsucclength(T->lchild,sumlen,m,level+1);
    Unsucclength(T->rchild,sumlen,m,level+1);
}
double prUnsucclength(BSTree T)    //输出查找失败比较次数 sumlen
{
    int sumlen=0,m=0;
    Unsucclength(T,sumlen,m,1);
    printf("查找失败的比较次数:%d\n",sumlen);
}
double ASLunsucc(BSTree T)    //求查找失败情况下的平均查找长度
{
    int sumlen=0,m=0;
    Unsucclength(T,sumlen,m,1);
    return sumlen*1.0/m;
}


int main()
{
    BSTree T;
    int k;
    BSTree result;
    printf("建立二叉排序树,请输入序列:\n");
    CreateBST(&T);
    printf("先序遍历输出序列为:");
    PreOrder(T);
    printf("\n请输入要查找的元素:");
    fflush(stdin);//fflush (stdin)是一个计算机专业术语,功能是清空输入 缓冲区 ,通常是为了确保不影响后面的数据读取(例如在读完一个 字符串 后紧接着又要读取一个字符,此时应该先执行fflush (stdin);。
    scanf("%d",&k);
    printf("\n递归或非递归实现二叉排序树的查找并给出查找路径:");
    SearchBST(T, k);
    
    printf("\n二叉树的的嵌套括号表示:");
    Show(T);
    
    
    
    int h;
    h=height(T);
    printf("\n该二叉排序树的高度为:%d\n",h);
    
    int sumlen=0,m=0;
    prSucclength(T);
    prUnsucclength(T);
    printf("(3)ASLsucc=%g\n",ASLsucc(T));     //ASL = 1/6 * (1+2+2+3+3+3) = 14/6
    printf("(4)ASLunsucc=%g\n",ASLunsucc(T));
    
    //{45,24,53,12,37,93} 和 {12,24,37,45,53,93}
    
    
    
    
    
    
}


引用new bing部分回答作答:
以下是可以实现倒立树形式显示二叉排序树的代码:

void InvertShow(BSTree T, int level) {
    if (T == NULL) return;

    InvertShow(T->rchild, level + 1);
    for (int i = 1; i <= level; ++i) {
        printf("    ");
    }
    printf("%d\n", T->key);
    InvertShow(T->lchild, level + 1);
}

这个函数的功能是将二叉排序树倒过来,并以树形式打印出来。函数的参数T表示二叉排序树的根节点,level表示节点所在的深度,根节点的深度为1,左儿子的深度为父节点深度加1,右儿子的深度也为父节点深度加1。
函数的实现原理是先遍历右子树,然后在屏幕上打印节点的值,最后遍历左子树。在打印节点的值之前,需要先打印若干个空格,其数量为该节点的深度乘以一个固定的值(例如4)。

另外,由于本代码使用了printf函数来输出结果,因此需要包含stdio.h头文件。

不建议你这样print
建议你用逗号分隔存储数组的办法保存二叉树,其中空的数据域用某个特殊符号代替
数组第一个元素存储根节点,然后对于i节点,它的子节点是i2+1和i2+2,递归写入对应的数组位置
(鉴于现在GPT胡乱回答太多,且很多题主好坏不分地胡乱采纳,为节约体力,如果需要详细代码,我可以进一步补充回答)

基于new Bing的修改:
补充倒立的树的形式显示二叉排序树代码如下:



void ShowInverted(BSTree T, int level){
if(T){
ShowInverted(T->rchild, level+1);
for(int i=0;i<level;i++){
cout<<"   ";
}
cout<<T->key<<"\n";
ShowInverted(T->lchild, level+1);
}
}

在主函数中可以调用该函数进行倒置展示:


printf("\n倒置显示二叉排序树:\n");
ShowInverted(T, 1);


#include <iostream>  
#include <vector>  
  
using namespace std;  
  
class TreeNode {  
public:  
    int val;  
    TreeNode *left;  
    TreeNode *right;  
  
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  
};  
  
class Solution {  
public:  
    TreeNode* buildTree(vector<int>& nums) {  
        int n = nums.size();  
        vector<TreeNode*> nodes(n, nullptr);  
        for (int i = 0; i < n; i++) {  
            int val = nums[i];  
            if (nodes[i] == nullptr) {  
                nodes[i] = new TreeNode(val);  
            } else {  
                nodes[i]->left = new TreeNode(nodes[i]->val + 1);  
            }  
        }  
        return nodes[0];  
    }  
  
    void reverseTree(TreeNode* root) {  
        if (root == nullptr) {  
            return;  
        }  
        reverseTree(root->left);  
        reverseTree(root->right);  
        root->left = nullptr;  
        root->right = nullptr;  
    }  
};  
  
int main() {  
    Solution solution;  
    vector<int> nums = {3, 1, 5, 0, 4, 6, 2};  
    TreeNode* root = solution.buildTree(nums);  
    solution.reverseTree(root);  
    cout << root->val << " ";  
    cout << root->left->val << " ";  
    cout << root->right->val << endl;  
    return 0;  
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7730094
  • 你也可以参考下这篇文章:C++代码示例2 ~ 求立方体的面积和体积并求出两个立方体是否相等
  • 您还可以看一下 邵发老师的《C语言/C++学习指南》加密解密篇(安全相关算法)课程中的 暴力破解法小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    很抱歉,我作为语言模型无法提供代码方面的修改建议。但是根据参考资料可以得出,在 C++ 中实现倒立的树形式显示二叉排序树需要对二叉排序树进行遍历,按照先右子树,再根节点,最后左子树的顺序输出节点。可以使用递归或者栈的方法实现遍历。同时,在输出每个节点的同时,需要考虑节点的层数,根据节点所处的层数,在其前面添加相应个数的空格,使其呈倒立的树形式。可参考以下代码:

    #include <iostream>
    #include <stack>
    using namespace std;
    
    struct TreeNode{
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
    };
    
    //向二叉排序树中插入节点
    void insert(TreeNode* &root, int val){
        if(root == nullptr){
            root = new TreeNode(val);
            return;
        }
        if(val < root->val){
            insert(root->left, val);
        }
        else{
            insert(root->right, val);
        }
    }
    
    //遍历二叉排序树并输出,层数越深前面的空格越多
    void inorderTraversal(TreeNode* root, int depth){
        if(root == nullptr){
            return;
        }
        inorderTraversal(root->right, depth+1);
        for(int i=0; i<depth; i++){
            cout << "  "; //每多一层就多输出两个空格
        }
        cout << root->val << endl;
        inorderTraversal(root->left, depth+1);
    }
    
    int main(){
        TreeNode* root = nullptr;
        int n, num;
        cout << "请输入二叉排序树的节点数: ";
        cin >> n;
        cout << "请逐个输入节点的值: ";
        for(int i=0; i<n; i++){
            cin >> num;
            insert(root, num);
        }
        cout << "生成的二叉排序树如下: " << endl;
        inorderTraversal(root, 0);
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^