weixin_51114263 2022-12-28 23:33 采纳率: 65%
浏览 76

层序二叉树存在漏结点现象,如何解决?

(C++)在测试二叉树和前序遍历的过程中,发现在有些情况下存在漏结点现象
例如:输入:
10
1 2 3 null a 4 b 5 c 6 (CSDN平台不允许重复null,第一个后面的用 a b c代替)
输出的前序遍历结果为:
1 2 3 4
后面的被遗漏了,请问代码
应该怎么改才不会漏掉节点呢?

#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>

using namespace std;

//二叉树节点定义
typedef struct BiTNode//二叉树的结点数据结构
{
    int data;
    BiTNode* lchild, * rchild;
};

//按层序输入,结点为空时,输入'#'
BiTNode* CreateBiTree(int* a, int n, int start)//*a为data,n为数组长度,start为根节点
{
    if (a[start] == '#') return NULL;//当根节点为空,即空树

    BiTNode* root = new BiTNode;//新建一个根结点
    root->data = a[start];//给根结点root的成员变量data,lchild,rchild赋初值
    root->lchild = NULL;
    root->rchild = NULL;

    int lnode = 2 * start + 1;//用根节点确定左节点的位置
    int rnode = 2 * start + 2;//用根节点确定右节点的位置

    if (lnode > n - 1) root->lchild = NULL;
    else root->lchild = CreateBiTree(a, n, lnode);//lnode替换start,为左子树的根节点

    if (rnode > n - 1) root->rchild = NULL;
    else root->rchild = CreateBiTree(a, n, rnode);//rnode替换start,为右子树的根节点

    return root;
}

//先序遍历函数(递归完成)
void PreOrderTraverse(BiTNode* T)
{
    if (T) {
        cout << T->data << " ";
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}




int main()
{
    int N = 0;
    cin >> N;



    for (int i = 0; i < N; i++)
    {

        int len = 0;
        cin >> len;

        int nums[100];
        cin.ignore();

        string input;
        getline(cin, input); // 读取一行数据
        stringstream ss(input); // 将字符串转化为数据流
        string temp;
        int index = 0;
        while (ss >> temp) // 从数据流中读取一个字符串
        {
            if (temp == "null") // 如果为null,转化为99999
                nums[index++] = '#';
            else
                nums[index++] = stoi(temp); // 将字符串转化为数字
        }

        // 输出结果
        /*for (int i = 0; i < index; i++)
            cout << nums[i] << " ";
        cout << endl;*/

        PreOrderTraverse(CreateBiTree(nums, len, 0));


        cout << endl;
    }
        return 0;
    
}


  • 写回答

1条回答 默认 最新

  • qq_1311209878 2022-12-29 08:52
    关注

    在构建二叉树时,由于节点为空的情况较多,可能会被遗漏掉。这是由于,当节点为空时,递归函数并不会进入下一层,所以无法遍历到这些结点。

    为了解决这个问题,可以修改一下先序遍历函数,使得当节点为空时,也能进入下一层进行遍历。例如,可以将先序遍历函数修改为如下形式:

    void PreOrderTraverse(BiTNode* T)
    {
    if (T) {
    cout << T->data << " ";
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
    }
    else {
    cout << "null ";
    PreOrderTraverse(NULL);
    PreOrderTraverse(NULL);
    }
    }

    这样,当遍历到空节点时,就会输出"null",并继续递归遍历空节点的左右子节点。

    希望这能帮到你!望及时采纳。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月28日

悬赏问题

  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 如何在cst中建立这种螺旋扇叶结构
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥20 想写一个文件管理器,加载全部子文件夹后,要一级一级返回
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?
  • ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角