二叉树算法总结

刷了几道二叉树的算法题,基本都可以用递归求出来,在可以使用回溯法的题目中,回溯法的时间开销比递归少。

递归调用分为两类:1.在根节点到叶子节点的路径中找出满足条件的值

         2.在任意两个节点之间寻找满足条件的路径

根节点到叶子节点的路径选择

leetcode上有类似的题目,

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

For example,

    1
   /   2   3

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.

思路一:可以使用递归调用,从根节点将需要保存的内容保存起来,判断到达叶子节点则判断该路径是否满足题目要求

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int sumNumbers(TreeNode* root) {
13         vector<int> sumVec;
14         int result;
15         int sum = 0;
16         if(root==NULL){
17             return 0;
18         }
19         sumHelper(root,sumVec,result);
20         for(int i = 0;i<sumVec.size();i++){
21             sum+=sumVec[i];
22         }
23         return sum;
24     }
25     int sumHelper(TreeNode* root,vector<int>& sumVec,int result){
26         if(!root->left&&!root->right){
27             result = result*10+(root->val);
28             sumVec.push_back(result);
29         }
30         if(root->left){
31              int resultl = result;
32              resultl = resultl*10+(root->val);
33              sumHelper(root->left,sumVec,resultl);
34         }
35         if(root->right){
36             result = result*10+(root->val);
37             sumHelper(root->right,sumVec,result);
38         }
39     }
40 };

思路二,回溯法

任意两个节点间的路径选择

Given a binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path does not need to go through the root.

For example:
Given the below binary tree,

       1
      /      2   3

Return 6.

使用递归,使用全局变量MaxSum保存历史最大值,以root为起始扩散点的目的是将所有路径遍历完。

注意:节点的值为负数时,不用将其加入路径中。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11     int maxSum;
12 public:
13     int maxPathSum(TreeNode* root) {
14         maxSum = -99999;
15         if(root==NULL){return 0;}
16         DFS(root);
17         return maxSum;
18     }
19     int DFS(TreeNode* root){
20         if(root==NULL) return 0;
21         int sum = root->val;
22         int l = DFS(root->left);
23         int r = DFS(root->right);
24         if(l>0){
25             sum+=l;
26         }
27         if(r>0){
28             sum+=r;
29         }
30        // int sum = l+r+root->val;
31         maxSum = max(sum,maxSum);
32         return (root->val+max(max(l,0),max(r,0)));
33     }
34 };
时间: 2024-10-11 22:01:09

二叉树算法总结的相关文章

二叉树算法

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>二叉树算法</title> <script type="text/javascript"> window.onload = function () { function Node(data, le

JavaScript实现二叉树算法

二叉树的遍历方式 分别为中序遍历(左子树->当前节点->右子树).前序遍历(当前节点->左子树->右子树).后序遍历(左子树->右子树->当前节点).下面使用JavaScript语言实现二叉树的三种遍历算法. 首先构造一个排序二叉树(即满足左子节点比父节点小,右子节点比父节点大的二叉树),然后对其分别进行中序.前序.后序遍历. 排序二叉树结构图如下图所示: 说明: 其中8为根节点(没有父节点的节点),4,.7.13为叶子节点(最后一层上没有子节点的节点),3.10.1.

python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 connection = pymysql.connect(host='127.0.0.1',port=3306,user='roo

js二叉树算法

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,分别是指向父母.左孩子和右孩子的指针.每一个节点都是通过指针相互连接的.相连指针的关系都是父子关系. 二叉树节点的定义 二叉树节点定义如下: struct BinaryTreeNode { i

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

二叉树算法小结

= 导航 顶部 概述 准备工作 先序遍历法 中序遍历法 后序遍历法 层次遍历法 测试 总结 顶部 概述 准备工作 先序遍历法 中序遍历法 后序遍历法 层次遍历法 测试 总结 概述 遍历二叉树有前序,中序,后序三大方法算.对于二叉树的三种不同的遍历方式,用递归的方法很容易写出实现代码,对于非递归的遍历算法使用数据结构堆栈作为工具代替递归以节省时空开销,在经过节点是先将其压入栈,要到他第几次从栈中弹出是才访问它,对于前序来说,是一次,对于中序来说是两次,对于后序则是三次.下面介绍下二叉树的几种遍历算

分层遍历二叉树算法

分层遍历二叉树的集中情况 从上而下的打印 vector<vector<int>> printLevel(TreeNode *root) {          vector<vector<int>>  ret;     if(root == NULL) return ret;          queue<TreeNode *> q;     int size;     q.push_back(root);     while(!q.empty()

数据结构-5-平衡二叉树算法原理解析

平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树. 平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1; 很显然,平衡二叉树是在二叉排序树(BST)上引入的,就是为了解决二叉排序树的不平衡性导致时间复杂度大大下降,那么AVL就保持住了(BST)的最好时间复杂度O(logn),所以每次的插入和删除都要确保二叉树的平衡. 关于书上说的旋转操作的概念,一般人真的看不

java之二叉树算法

创建二叉树类 public class tree { int data; tree left; tree right; public tree(int data, tree left, tree right) { super(); this.data = data; this.left = left; this.right = right; } public tree(int data) { this.data=data; this.left=null; this.right=null; } p