剑指Offer-- 二叉搜索树中和为某一值的路径

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

本身题目不是很难,但是因为刚接触pyhon,对一些对象的传递不太了解,所以跳了很久也没有通过,后来看到这篇文章  后才明白,犯了一样的错误

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        # write code here
        res = []             # 存放结果     注意若写成res[[]],那么结果会多出一个[],
        paths = []           # 存放路径     这里没有使用stack,因为python中列表是可变的,具有stack的功能
        self.helper(root, res, paths, expectNumber)
        return res

    def helper(self, root, res, paths, expectNumber):
        if root:
            paths.append(root.val)   # 将访问节点的值存入到 路径 列表中
            if (sum(paths) == expectNumber) and (not root.left) and (not root.right):    #  若是 路径 列表中的总和等于给定的数值,那么就将此路径添加到结果中
                res.append(paths[:])      #   注意此处 !! 不是 res.append(paths) 因为python的可变对象都是引用传递

            if root.left:     #   访问左子树
                self.helper(root.left, res, paths, expectNumber)

            if root.right:    #   访问右子树
                self.helper(root.right, res, paths, expectNumber)

            del paths[-1]   #  每次从子节点返回到父节点时 要删除掉子节点的值

思路就是 :  去考虑前序遍历二叉树,然后在遍历的时候根据题目的要求去做一些判断

在helper函数中,可以大致分为三块,第一块是对于访问到的根节点进行一些操作处理,第二块是访问左子树,第三块是访问右子树,最后别忘了 每次从子节点返回到父节点时,要在路径中删除子节点的值

时间: 2024-11-16 06:22:26

剑指Offer-- 二叉搜索树中和为某一值的路径的相关文章

剑指OFFER 二叉搜索树的后序遍历

剑指OFFER 二叉搜索树的后序遍历 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析 判断是否是二叉搜索树的后序遍历结果,那么得先明白什么是二叉搜索树,还有什么是后序遍历 这是一颗二叉搜索树,其每个节点都满足 左孩子<父母<右孩子 其后序遍历为 4 7 5 10 12 11 9 [ 小][ 大 ][中] 然后小部分/大部分内部也同样满足这样的规律,那么,用递归是最方便的 代码 class

剑指offer——二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出true,否则输出false.假设输入的数组的任意两个数字都不相同. 思路:首先二叉搜索树是指左子树全部小于根节点,右子树全部大于根节点的树.故: 对于一棵树:首先找到右子树的第一个节点,然后判断右子树中是否有小于根节点的节点,若有,则输出false. 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3

剑指offer 二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路:迭代版本: 核心思想是中序遍历,头结点需要单独设置flag变量进行初始化. if(!s.empty()){ if(flag == 1){ head = s.top(); cur = s.top(); s.pop(); cur -> left = pre; pre -> right = cur; pre = pre -> right; flag = 0; }

剑指offer系列22--二叉树中和为某一值的路径

22[题目]输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径. * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 * [思路]只要从根结点到叶结点一条一条遍历; * 如果到了叶结点,且此路径值跟目标值相同,就添加此路径: 不是,则从孩子子节点开始查找. [注]叶结点遍历完后要删除此叶结点值直至返回到父节点. 1 package com.exe5.offer; 2 3 import java.util.ArrayList; 4 5 /** 6 * 22[

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

《剑指offer》:[41]数组中和为S的两个数

题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的它们的和正好是S.如果有多对数字的和等于S,输出其中的一对即可. 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11. 方案一:时间复杂度为O(N*N).顺序查找法,固定一个数,然后和剩余的N-1个数做和,看和是否为S:如没有,将固定的数下移一个,再与N-2个数字做和,看是否相等.很明显,其时间复杂度为:O(N*N) . 方案二:时间复杂度为O(N)的查找方法.因为数组是有序的递增的序列,我

[剑指offer] 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入描述 一个整数 输出描述 该数二进制表示中1的个数 题目分析 解法一 运行时间:29m 占用内存:629k public int NumberOf1(int n) { String s=Integer.toBinaryString(n); char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if(c[i]=='1'){ j++; } } re

剑指offer(二十六)之数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 思路一: 用冒泡的思想,当遇到相等的元素的时候,将它放到duplication[0]当中,并将标志tag,改为true <span style="font-family:SimSun;font-size:18px;&

剑指offer—二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数.如9的二进制是1001,因此输入9输出2. 解法一:可能死循环 int num1(int n) { int count =0; while(n) { if(n&1) count++; n=n>>1; } return count; } 上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环. 解法二:无死循环但效率低 int num1(int n) { int count =