算法——二叉树类
Posted 玛丽莲茼蒿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法——二叉树类相关的知识,希望对你有一定的参考价值。
一、解题思路
二叉树类的算法有两条解题思路。选一个就能解题
1. 思路(一):这也是我最常用的思路。只针对根节点和其左右子树(把左右子树各看成一个节点就行)解决当前问题,就像下面这样。这样就避免了对递归的考虑
1)边界:考虑是一颗空树时的情况(root==null)
2)再考虑对根节点的处理,对左子树的处理,对右子树的处理
2. 思路(二):递归思想。
1)递归出口:叶子结点
2)再考虑对根节点的处理,对左子树的处理,对右子树的处理
二、例题
这些例题我都是用第一个思路去做的,也在注释上标明了思路。
1. 翻转二叉树
/**
* Definition for a binary tree node.
* struct TreeNode
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr)
* TreeNode(int x) : val(x), left(nullptr), right(nullptr)
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right)
* ;
*/
class Solution
public:
TreeNode* invertTree(TreeNode* root)
//1.空树
if(root==NULL) return NULL;
//2.根节点不用考虑
//3.考虑左子树和右子树的处理
TreeNode* left=invertTree(root->right); //left是翻转后应该在left的
TreeNode* right=invertTree(root->left); //right是翻转后应该在right的
root->right=right;
root->left=left;
return root; //!!!最后返回整棵树的根节点
;
2.相同的树
/**
* Definition for a binary tree node.
* struct TreeNode
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr)
* TreeNode(int x) : val(x), left(nullptr), right(nullptr)
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right)
* ;
*/
class Solution
public:
bool isSameTree(TreeNode* p, TreeNode* q)
//1.空树
if(p==nullptr&&q==nullptr) return true; //空树1
else if(p==nullptr&&q!=nullptr) return false; //空树2
else if(p!=nullptr&&q==nullptr) return false; //空树3
//2.这里把根节点、左子树、右子树的处理一起考虑了
else
return (p->val==q->val&&isSameTree(p->left,q->left)&&isSameTree(p->right,q->right));
;
3. 路径总和
这个题注意看一下最后一个示例3。
/**
* Definition for a binary tree node.
* struct TreeNode
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr)
* TreeNode(int x) : val(x), left(nullptr), right(nullptr)
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right)
* ;
*/
class Solution
public:
bool hasPathSum(TreeNode* root, int targetSum)
//1.空树
if(root==nullptr) return false;
//2.考虑根节点的处理
if(root->left==nullptr&&root->right==nullptr&&targetSum==root->val) return true;
//3.考虑对左子树、右子树的处理
int left = targetSum - root->val;
return hasPathSum(root->left,left)||hasPathSum(root->right,left);
;
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于算法——二叉树类的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):树类:第98题:验证二叉搜索树:给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节
Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。
Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。