zoukankan      html  css  js  c++  java
  • 二叉树中和为某一值的路径(Python and C++解法)

    题目:

      输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

    示例:
    给定如下二叉树,以及目标和 sum = 22,

            5
           /
          4  8
         /    /
       11 13 4
       /       /
      7 2    5 1
    返回:

    [
    [5,4,11,2],
    [5,8,4,5]
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof

    思路:

      路径肯定包括根节点,因此遍历节点时应该保证先遍历根节点,前序遍历符合要求。

      需要有列表记录下遍历过的路径。

      Python中赋值语句总是建立对象的引用值,而不是复制对象,所以如果直接res.append(path),当后面改变path内容时,res里的path会随之改变,因此可以使用浅拷贝,复制一个对象,方法如path[:],或list(path)

    Python解法:

     1 class TreeNode:
     2     def __init__(self, x):
     3         self.val = x
     4         self.left = None
     5         self.right = None
     6 
     7 
     8 class Solution:
     9     def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
    10         res = []  # 存储所有正确的路径
    11         path = []  # 存储当前路径
    12 
    13         def dfs(fatherNode, sumPath):
    14             if fatherNode == None:  # 递归终止条件
    15                 return
    16             path.append(fatherNode.val)  # 每条路径都有根节点
    17             sumPath -= fatherNode.val
    18             # 路径满足的条件是sum减为零,且已到达叶节点
    19             if sumPath == 0 and fatherNode.left == None and fatherNode.right == None:
    20                 res.append(list(path))
    21             dfs(fatherNode.left, sumPath)  # 递归判断左子树是否有符合的路径
    22             dfs(fatherNode.right, sumPath)  # 递归判断右子树是否有符合的路径
    23             # 如果到某一叶节点的路径不符合要求,那么应return回溯到上一层,删除该叶节点,sum也随着回溯处于上一层的数值
    24             path.pop()  # 当前的函数结束后才能pop叶节点
    25         dfs(root, sum)  # 函数调用
    26         return res

    C++解法:

     1 struct TreeNode {
     2     int val;
     3     TreeNode *left;
     4     TreeNode *right;
     5     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     6 };
     7 
     8 class Solution {
     9 public:
    10     vector<vector<int>> res;  // 存储最终结果
    11     vector<int> path;
    12     vector<vector<int>> pathSum(TreeNode* root, int sum) {
    13         dfs(root, sum);
    14         return res;
    15     }
    16 
    17     void dfs(TreeNode *root, int sum) {
    18         if (root == NULL)    return;  // 递归终止条件
    19         path.push_back(root->val);  // 路径肯定要添加进根节点
    20         sum -= root->val;
    21         // 路径满足的条件是sum减为零,且已到达叶节点
    22         if (sum == 0 && root->left == NULL && root->right == NULL)
    23             res.push_back(path);
    24         dfs(root->left, sum);  // 递归判断左子树是否有符合的路径
    25         dfs(root->right, sum);  // 递归判断右子树是否有符合的路径
    26         // 如果到某一叶节点的路径不符合要求,那么应return回溯到上一层,删除该叶节点,sum也随着回溯处于上一层的数值
    27         path.pop_back();  // 当前的函数结束后才能pop叶节点
    28     }
    29 };
  • 相关阅读:
    我经历的IT公司面试及离职感受(转)
    一个优异的经理人,碰到糟糕的企业,最后往往存在的还是那间糟糕的企业(转)
    Android TextView和EditText属性详解
    Android EditText控件行尾为表情时的BUG
    Android安全问题 抢先拦截短信
    Android安全问题 抢先开机启动
    Android安全问题 抢先接收广播
    Android安全问题 抢先接收广播
    Android 监听EditView中的文本改变事件
    Android EditText中插入图片并响应点击事件
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13278097.html
Copyright © 2011-2022 走看看