面试题34:二叉树中和为某一值的路径

题目描述

输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径,从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
如图二叉树中有两条和为22的路径,一条路径经过节点10、5、7;另一条路径经过节点10、12


image.png

解题思路

  • 首先分析怎么访问节点
    因为路径是从根节点出发到叶节点的,所以只有前序遍历符合
  • 使用什么数据类型存放路径中节点
    当用前序遍历的方式访问某一节点时,将该节点添加到路径上,
  1. 如果该节点为叶节点并且路径中节点值的和刚好等于输入的整数,则当前路径符合要求并打印。
  2. 如果该节点不是叶节点,则继续访问它的子节点。
  3. 若当前节点访问结束后,递归函数将自动回到它的父节点。因此,在函数退出之前要在路径上删除当前节点并减去当前节点的值,以确保返回父节点时路径刚好是从根结点到父节点。发现,递归调用的本质就是压栈和出栈的过程。但是选择vector容器比较合适在遍历输出路径中的结点时。

代码

  • 注意
    代码中vector作为形参时,也是引用的方式。
void  FindDepth(BinaryTreeNode *root,int expectedSum)
        {
            if(!root) //判断链表不为空
            {
                return  ;
            }
            
            vector depth_node;
            int current_sum=0;
            FindDepth(root,current_sum,depth_node,expectedSum);
        }

 void FindDepth(BinaryTreeNode *root,int current_sum,vector &depth_node,int expectedSum)
 {
            if(root)
            {
                current_sum = current_sum + root->val;
            }
            depth_node.push_back(root->val);
            //当前节点是叶子结点,则判断路径节点和是否等于ExpectedSum
            bool leaf_node = (root->left == NULL) && (root->right == NULL) && (current_sum == expectedSum);
            if(leaf_node == 1)
            {
                cout << "a path is found:";
                for(vector::iterator it = depth_node.begin();it != depth_node.end();it++)
                {
                    cout << *it << " ";
                }
                cout << endl;
            }
            if(root->left)
            {
               FindDepth(root->left,current_sum,depth_node,expectedSum);
            }
            if(root->right)
            {
               FindDepth(root->right,current_sum,depth_node,expectedSum);
            }
            depth_node.pop_back();
            //若相等,则从vector中输出
            //若不相等,则递归回去,寻找别的节点
            //删除结点
 }

完整代码见GitHub

你可能感兴趣的:(面试题34:二叉树中和为某一值的路径)