zoukankan      html  css  js  c++  java
  • 在二叉树中找出和为某一值的所有路径

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

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

     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 }

      测试结果如下:

  • 相关阅读:
    Beta版本冲刺第二天 12.6
    Beta版本冲刺第一天 12.5
    Linux学习(2)—— 图形化界面
    Linux学习(1)—— 虚拟机安装Linux系统
    IntelliJ IDEA使用
    spring+springmvc+hibernate 整合
    新的篇章
    软件工程实践总结作业——个人作业
    Beta版本冲刺———第七天
    Beta版本冲刺———第六天
  • 原文地址:https://www.cnblogs.com/ldjhust/p/3051895.html
Copyright © 2011-2022 走看看