博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 二叉树打印节点路径
阅读量:6991 次
发布时间:2019-06-27

本文共 3390 字,大约阅读时间需要 11 分钟。

leetcode上有道题是关于path sum的,我第一时间的做法是用二叉树的路径去与sum比较。所以需要去打印出二叉树的节点路径,以下是用回溯法。

1 #include
2 #include
3 using namespace std; 4 5 struct TreeNode { 6 int val; 7 TreeNode *left; 8 TreeNode *right; 9 TreeNode(int x) : val(x), left(NULL), right(NULL) {}10 11 };12 class Solution {13 public:14 bool hasPathSum(TreeNode* root, int sum) {15 vector
path;16 path.reserve(100);17 bool flag = false;18 printPaths(root, path, 0);19 return flag;20 }21 void printPaths(TreeNode* node, vector
& path, int pathlen) {22 if (node == NULL) return;23 // append this node to the path array 24 path[pathlen++] = node->val;25 // path.push_back(node->val);26 // it's a leaf, so print the path that led to here 27 if (node->left == NULL && node->right == NULL) {28 printArray(path, pathlen);29 }30 else {31 // otherwise try both subtrees 32 printPaths(node->left, path, pathlen);33 printPaths(node->right, path, pathlen);34 path.pop_back();35 }36 }37 void printArray(vector
&ints, int len) {38 for (int i = 0; i < len; i++) {39 cout << ints[i] << " " ; 40 }41 cout << endl;42 }43 };44 45 int main()46 {47 Solution res;48 TreeNode t1(5);49 TreeNode t2(4);50 TreeNode t3(8);51 TreeNode t4(11);52 TreeNode t5(13);53 TreeNode t6(4);54 TreeNode t7(7);55 TreeNode t8(2);56 TreeNode t9(1);57 t1.left = &t2;58 t1.right = &t3;59 t2.left = &t4;60 t3.left = &t5;61 t3.right = &t6;62 t4.left = &t7;63 t4.right = &t8;64 t6.right = &t9;65 TreeNode * root = &t1;66 bool ret = res.hasPathSum(root,22);67 68 system("pause");69 return 0;70 }

接着与sum做比较就能知道path sum是否相同了。

1 class Solution { 2 public: 3     bool hasPathSum(TreeNode* root, int sum) { 4         vector
path; 5 path.reserve(100); 6 bool flag = false; 7 printPaths(root, path, 0, sum, flag); 8 return flag; 9 }10 void printPaths(TreeNode* node, vector
& path, int pathlen, int& sum, bool& flag) {11 if (node == NULL) return;12 // append this node to the path array 13 path[pathlen++] = node->val;14 // path.push_back(node->val);15 // it's a leaf, so print the path that led to here 16 if (node->left == NULL && node->right == NULL) {17 printArray(path, pathlen, sum, flag);18 if (flag) return;19 }20 else {21 // otherwise try both subtrees 22 printPaths(node->left, path, pathlen, sum, flag);23 printPaths(node->right, path, pathlen, sum, flag);24 path.pop_back();25 }26 }27 void printArray(vector
&ints, int len, int& sum, bool& flag) {28 int num = 0;29 for (int i = 0; i < len; i++) {30 // cout << ints[i] << " " ; 31 num += ints[i];32 }33 if (num == sum) flag = true;34 // cout << endl;35 }36 };

不过这种方法不好,空间开销大,效率还不高。在网上看到这种解法贴一下地址:

 

转载于:https://www.cnblogs.com/Hwangzhiyoung/p/10364254.html

你可能感兴趣的文章
jQuery和Zepto冲突问题【解决】
查看>>
machinekey生成工具 v1.0 官方最新版
查看>>
http server v0.1_mime.c
查看>>
open files
查看>>
MVC ——RouteTable.Routes的使用
查看>>
玩转X-CTR100 | STM32F4 l X-Assistant串口助手控制功能
查看>>
TCP/IP学习笔记1--概述,分组交换协议
查看>>
深入百度外链工具引发的思考
查看>>
DataBindings 与 INotifyPropertyChanged 实现自动刷新 WinForm 界面
查看>>
VB中数据占几个字节
查看>>
交通压力主动感知系统
查看>>
对于技术服务和业务的思考
查看>>
数据链路层
查看>>
Memcached 客户端使用
查看>>
【193】◀▶ PowerShell 官方资料索引
查看>>
linux 学习
查看>>
JDK安装和环境变量配置
查看>>
GO环境配置
查看>>
Android ocr识别文字介绍(文字识别)
查看>>
hdoj 2199 Can you solve this equation? 【二分枚举】
查看>>