• 在二叉树中找出和为某一值的所有路径


      对于这个问题我们可以利用前序遍历搜索二叉树的每一条路径,并利用栈保存找到的路径,然后判断此路径是否符合要求,若符合要求则输出此路径,否则继续寻找下一条路径。即利用回溯和递归的思想。

      基于上述分析,可写出如下获取并判断路径的方法:

     1 void GetRoad(BinaryTreeNode *root, int *Stack, int nTop, int nSum, int nValue)
     2 {
     3     assert (root != NULL);
     4 
     5     assert (Stack != NULL);
     6 
     7     assert (nTop >= -1);
     8 
     9     if ((NULL == root->lChild) && (NULL == root->rChild))
    10     {
    11         // 若当前节点是叶节点,则找到了这颗二叉树的一条路径,将也节点入栈,再判断这条路径是否符合要求
    12         Stack[++nTop] = root->nData;
    13         nSum += root->nData;
    14 
    15         if (nSum == nValue)
    16         {
    17             // 找到了一条路径,则路径数加1,并且将其打印出来
    18             ++ROAD_NUM;
    19 
    20             PrintRoad (Stack, nTop);
    21 
    22             // 打印一条路径后换一行
    23             cout << endl;
    24         }
    25 
    26         return;
    27     }
    28 
    29     nSum += root->nData;
    30 
    31     Stack[++nTop] = root->nData;
    32 
    33     GetRoad (root->lChild, Stack, nTop, nSum, nValue);
    34 
    35     GetRoad (root->rChild, Stack, nTop, nSum, nValue);
    36 }

      若找到一条符合条件的路径,则可利用递归将保存在栈中的路径打印出来,代码如下:

     1 void PrintRoad(int *Stack, int nTop)
     2 {
     3     assert (Stack != NULL);
     4 
     5     if (-1 == nTop)
     6     {
     7         return;
     8     }
     9 
    10     PrintRoad (Stack, nTop - 1);
    11 
    12     cout << Stack[nTop] << " ";
    13 }

      以上就是解决这个问题的算法,接下来为了测试,我们用前序快速建立一颗二叉树,代码如下:

     1 // 前序快速创建一颗二叉树
     2 void CreateBinaryTree(BinaryTreeNode *&root)
     3 {
     4     int data;
     5 
     6     cout << "输入根节点,-1为空: ";
     7     cin >> data;
     8 
     9     if (-1 == data)
    10     {
    11         root = NULL;
    12 
    13         return;
    14     }
    15 
    16     if (NULL == (root = (BinaryTreeNode *)malloc (sizeof (BinaryTreeNode))))
    17     {
    18         cout << "Fail to malloc space to root!\n";
    19         getch ();
    20     }
    21 
    22     root->nData = data;
    23 
    24     // 创建root的左子树
    25     cout << "创建 " << root->nData <<" 的左子树\n";
    26     CreateBinaryTree (root->lChild);
    27 
    28     // 创建右子树
    29     cout << "创建 " << root->nData <<" 的右子树\n";
    30     CreateBinaryTree (root->rChild);
    31 }

      测试结果如下:

  • 相关阅读:
    FT View SE联合Studio 5000仿真
    安装AB编程软件提示安装失败时如何处理
    如何识别Studio 5000程序开发版本号
    Studio 5000编程:一种累计时间的编程方法
    CPU或以太网模块重启DHCP请求
    Studio 5000编程:如何判断AB PLC系统中的硬件设备是否在正常工作
    使用以太网通信方式刷新AB PLC固件
    初探Node-red结合阿里云数据库,定时显示数据
    SQL SERVER 按时间计算每天某值的平均值
    微信小程序对接显示阿里云数据库数据
  • 原文地址:https://www.cnblogs.com/ldjhust/p/3051895.html
Copyright © 2020-2023  润新知