找出二叉树中和为n的路径

找出二叉树中和为n的路径

题目描述:

输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

二叉树中的路径

从二叉树的根节点出发,至二叉树的叶子节点的一条直线,称为二叉树的一条路径

例如:输入整数22和如下二元树

10 /
5 12 /
4 7

则打印出两条路径:10, 12和10, 5, 7。

思路:

从二叉树的根节点出发,并将该节点入栈,更新currentSum的值,再遍历该节点的左子树,直到叶子节点后,判断currentSum的值,判断与输入值比较后,返回该叶子节点的父亲节点,并弹出栈顶元素,继续遍历父亲节点的右子树,直到叶节点。重复以上步骤,知道所有节点遍历完后。

代码实现

include <iostream>

#include &lt;vector&gt;
#include "tree.h"
#include &lt;cstring&gt;
using namespace std;

void Find(vector&lt;int&gt;&amp;, BTNode*, int, int);

// 寻找路径

void FindPath(BTNode *root, int pathSum)
{
	vector&lt;int&gt; path;
	int currentSum=0;
	memset(&amp;path, 0, sizeof(path));
	Find(path, root, pathSum, currentSum);
}

void Find(vector&lt;int&gt; &amp;path, BTNode *root, int pathSum, int currentSum)
{
	currentSum += root-&gt;data;  //记录当前路径的和
	path.push_back(root-&gt;data);   //将当前节点值压栈
	//判断当前节点是不是叶子节点
	bool isLeaf = root-&gt;left==NULL &amp;&amp; root-&gt;right==NULL;
	//该节点是叶子节点,且路径的和符合要求,则打印路径
	if(currentSum == pathSum &amp;&amp; isLeaf)
	{
		cout &lt;&lt; "A path is found: "&lt;&lt; endl;
		vector&lt;int&gt;::iterator it = path.begin();
		for(; it!=path.end(); it++)
			cout &lt;&lt; *it &lt;&lt; " ";
		cout &lt;&lt; endl;
	}
	//遍历该节点的左子树
	if(root-&gt;left!=NULL)
		Find(path, root-&gt;left, pathSum, currentSum);
	//遍历该节点的右子树
	if(root-&gt;right!=NULL)
		Find(path, root-&gt;right, pathSum, currentSum);
	//在返回父节点之前,将父节点弹栈
	path.pop_back();
}
//测试
int main(void)
{
	int data[] = {5, 10, 5, 12, 4, 7};
	BTNode *root = NULL;
	int pathSum = 22;
	insert_node(&amp;root, data, 1);
	FindPath(root, pathSum);
	return 0;
}

其中二叉树的数据结构定义为

struct BTNode
{
	int data;
	BTNode *left;
	BTNode *right;
};

//先序建立二叉树
void insert_node(BTNode **root, int *data, int i)
{
	if(i&lt;=data[0])
	{
		*root = new BTNode();
		(*root)-&gt;data = data[i];
		(*root)-&gt;left=NULL;
		(*root)-&gt;right=NULL;
		insert_node(&amp;((*root)-&gt;left), data, 2*i);
		insert_node(&amp;((*root)-&gt;right), data, 2*i+1);
	}
}

void remove_node(BTNode *root)
{
	if(root!=NULL)
	{
		BTNode *pDel = NULL;
		remove_node(root-&gt;left);
		remove_node(root-&gt;right);
		delete root; 
	}	
}

(以上部分摘抄自<<剑指Offer>>)

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk