二叉树的递归套路

二叉树递归套路(2):判断二叉树是否是搜索二叉树、二叉树的最大距离 文章目录一、判断二叉树是否是搜索二叉树1、经典做法2、递归套路思路3、递归套路代码二、二叉树的最大距离1、递归套路思路2、递归套路代码 本篇继续来聊聊二叉树的递归套路。 一、判断二叉树是否是搜索二叉树 搜索二叉树定义:二叉树中的任意一个以X为头的子树,左子树都比X小,右子树都比X大。(经典的搜索二叉树是没有重复值的) 1、经典做法 中序遍历,结果是递增的,说明这是搜索二叉树。 2、递归套路思路 分析任意一个以X为头的子树,满足以X为头的子树是搜索二叉树的条件(列出所有可能性) 1)左子树是搜索二叉树 2)右 阅读详情

思路:以X为根的树怎么得到结果,然后讨论可能性,需要哪些信息,然后创建信息类
模板:获取左子树的信息,获取右子树的信息,然后得到自己的信息
110. 平衡二叉树

平衡二叉树:左子树为平衡二叉树,右子树为平衡二叉树,左右子树高度差绝对值小于等于1
当判断以X为根的树是否为平衡二叉树时,需要三类信息,就是以上所列的,因此可以额外设计一个类,保存三类信息
class Info{
public:
bool isBlance;
int height;
Info(bool isBlance,int height):isBlance(isBlance),height(height){}
};

/**
 * 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:
    class Info{
    public:
        bool isBlance;
        int height;
        Info(bool isBlance,int height):isBlance(isBlance),height(height){}
    };
    Info* process(TreeNode* root){
        if(root==nullptr){//空树是平衡二叉树
            return new Info(true,0);
        }
        Info* leftInfo=process(root->left);
        Info* rightInfo=process(root->right);
        bool isBlance=true;//以root为根结点的树
        //满足下面3个if条件的任何一个,则该树就是平衡二叉树
        if(!leftInfo->isBlance){
            isBlance=false;
        }   
        if(!rightInfo->isBlance){
            isBlance=false;
        }
        if(abs(leftInfo->height - rightInfo->height)>1){
            isBlance=false;
        }
        int height=max(leftInfo->height,rightInfo->height)+1;//该树的高度
        return new Info(isBlance,height);
    }
    bool isBalanced(TreeNode* root) {
        return process(root)->isBlance;
    }
};

98. 验证二叉搜索树

分析:二叉搜索树的判断逻辑:

  1. 左子树为二叉搜索树
  2. 右子树为二叉搜索树
  3. 根节点的值大于左子树的最大值
  4. 根节点的值下于右子树的最小值
    满足以上条件的就是二叉搜索树。所以需要知道左右子树的相关信息
    class Info{
    public:
    bool isSearch;
    int maxVal;
    int minVal;
    Info(bool isSearch,int maxVal,int minVal):isSearch(isSearch),maxVal(maxVal),minVal(minVal){}
    };
    就是用来保存左右子树的相关信息
/**
 * 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:
    class Info{
    public:
        bool isSearch;
        int maxVal;
        int minVal;
        Info(bool isSearch,int maxVal,int minVal):isSearch(isSearch),maxVal(maxVal),minVal(minVal){}
    };
    Info* process(TreeNode* root){
        if(root==nullptr){//空树直接返回空
            return nullptr;
        }
        Info* leftInfo=process(root->left);//获得左子树的相关信息
        Info* rightInfo=process(root->right);//获得右子树的相关信息
        bool isSearch=true;
        int maxVal=root->val;
        int minVal=root->val;
        //判断逻辑
        if(leftInfo!=nullptr && !leftInfo->isSearch){
            isSearch=false;
        }
        if(rightInfo!=nullptr && !rightInfo->isSearch){
            isSearch=false;
        }
        if(leftInfo!=nullptr && root->val<=leftInfo->maxVal){
            isSearch=false;
        }
        if(rightInfo!=nullptr && root->val>=rightInfo->minVal){
            isSearch=false;
        }
        //求本树的最大值和最小值
        if(leftInfo!=nullptr && leftInfo->maxVal>maxVal){
            maxVal=leftInfo->maxVal;
        }
        if(rightInfo!=nullptr && rightInfo->maxVal>maxVal){
            maxVal=rightInfo->maxVal;
        }
        if(leftInfo!=nullptr && leftInfo->minVal<minVal){
            minVal=leftInfo->minVal;
        }
        if(rightInfo!=nullptr && rightInfo->minVal<minVal){
            minVal=rightInfo->minVal;
        }
        return new Info(isSearch,maxVal,minVal);

    }
    bool isValidBST(TreeNode* root) {
        return process(root)->isSearch;
    }
};

求二叉树的最大距离,即路径的最大节点数

分析:假设要求以X节点为根的树的最大距离。
有三种情况:

  1. 最大距离在左子树上
  2. 最大距离在右子树上
  3. 最大距离经过X节点,即左子树的高度+右子树的高度+1
    所以本题需要知道左子树的相关信息和右子树的相关信息
    因此需要构建Info类
    class Info {
    public:
    int largestDis;//最大距离
    int height;//高度
    Info(int largestDis,int height):largestDis(largestDis),height(height){}
    };
Info* process(Node* root) {//返回以root为根的树的相关信息
    if (root == NULL) {
        return new Info(0, 0);
    }
    Info* leftInfo = process(root->left);
    Info* rightInfo = process(root->right);
    //三种可能性
    int p1 = leftInfo->largestDis;
    int p2 = rightInfo->largestDis;
    int p3 = leftInfo->height + rightInfo->height + 1;
    int height = max(leftInfo->height, rightInfo->height) + 1;
    return new Info(max(p1, p2, p3), height);
}
int largetDis(Node* root) {
    process(root)->largestDis;
}

判断一棵树是否为满二叉树

分析:假设判断以X为根的二叉树是否为满二叉树
如果二叉树的节点数等于2h -1,(h为二叉树的高度),则该树为满二叉树。
要得到二叉树的节点数,需要知道左子树的节点数和右子树的节点数
要得到二叉树的高度,需要知道左子树的高度和右子树的高度。
所以信息类Info
class Info {
public:
int nodeSum;
int height;
Info(int nodeSum,int height):nodeSum(nodeSum),height(height){}
};

Info* process(Node* root) {
    if (root == NULL) {
        return new Info(0, 0);
    }
    Info* leftInfo = process(root->left);
    Info* rightInfo = process(root->right);
    int nodeSum = leftInfo->nodeSum + rightInfo->nodeSum + 1;
    int height = max(leftInfo->height, rightInfo->height) + 1;
    return new Info(nodeSum, height);
}
bool isFullBinaryTree(Node* root) {
    int height = process(root)->height;
    int nodeSum = process(root)->nodeSum;
    return nodeSum == pow(2, height) - 1;
}

二叉树中的最大搜索二叉子树

分析可能性:1 最大搜索子树在左子树上
2 最大搜索子树在右子树上
3 最大搜索子树就是本身
对于情况3,需要满足左子树为搜索二叉树,右子树也为搜索二叉树,左子树的最大值小于根结点的值,右子树的最小值大于根结点的值
所以信息类

class Info {
public:
	int maxBSTSize;//最大二叉搜索子树中结点的个数
	int allSize;//树的总个数
	int max;//最大值
	int min;//最小值
};
#include<iostream>
#include<unordered_map>
using namespace std;
class Info {
public:
	int maxBSTSize;//最大二叉搜索子树中结点的个数
	int allSize;//树的总个数
	int max;//最大值
	int min;//最小值
	Info(int maxBSTSize, int allSize, int max, int min) :maxBSTSize(maxBSTSize), allSize(allSize), max(max), min(min) {

	}
};
class Node {
public:
	int val;
	Node* left;
	Node* right;
	Node(int val):val(val) {
		left = NULL;
		right = NULL;
	}
};
Info* process(Node* root) {
	if (root == NULL) {
		return NULL;
	}
	int max = root->val;
	int min = root->val;
	int maxBSTSize = 0;
	int allSize = 1;
	Info* leftInfo = process(root->left);
	Info* rightInfo = process(root->right);
	if (leftInfo) {
		max = leftInfo->max > max ? leftInfo->max : max;
		min= leftInfo->min < min ? leftInfo->min : min;
		allSize += leftInfo->allSize;
		
	}
	if (rightInfo) {
		max = rightInfo->max > max ? rightInfo->max : max;
		min = rightInfo->min < min ? rightInfo->min : min;
		allSize += rightInfo->allSize;
		
	}
	int p1 = -1;//情况1,最大搜索子树在左子树
	if (leftInfo != NULL) {
		p1 = leftInfo->maxBSTSize;
	}
	int p2 = -1;//情况2,最大搜索子树在右子树
	if (rightInfo != NULL) {
		p2 = rightInfo->maxBSTSize;
	}
	int p3 = -1;//情况3
	bool leftIsBST = leftInfo == NULL ? true : (leftInfo->allSize == leftInfo->maxBSTSize);//左子树是否为二叉搜索树
	bool rightIsBST = rightInfo == NULL ? true : (rightInfo->allSize == rightInfo->maxBSTSize);
	bool isBST = true;
	if (leftInfo) {
		if (leftInfo->max >= root->val) {
			isBST = false;
		}
		
	}
	if (rightInfo) {
		if (rightInfo->min <= root->val) {
			isBST = false;
		}
		
	}
	if (leftIsBST && rightIsBST && isBST) {//该树为二叉搜索树
		int leftSize = leftInfo == NULL ? 0 : leftInfo->allSize;
		int rightSize = rightInfo == NULL ? 0 : rightInfo->allSize;
		p3 = leftSize + rightSize + 1;
	}
	maxBSTSize = std::max(p1, std::max(p2, p3));
	return new Info(maxBSTSize, allSize, max, min);
}
int maxBstSize(Node* root) {
	if (root == NULL) {
		return 0;
	}
	return process(root)->maxBSTSize;
}
void print(Node* root) {
	if (root == NULL) {
		return;
	}
	print(root->left);
	cout << root->val << " ";
	print(root->right);
}
int main() {
	int n, root;
	unordered_map<int, Node*>nodes;
	cin >> n >> root;
	nodes.emplace(root, new Node(root));
	for (int i = 0; i < n; ++i) {
		int fa, lch, rch;
		cin >> fa >> lch >> rch;
		Node* head = nodes[fa];
		if (lch == 0) {
			head->left = NULL;
		}
		else {
			Node* leftNode = new Node(lch);
			nodes.emplace(lch, leftNode);
			head->left = leftNode;
		}
		if (rch == 0) {
			head->right = NULL;
		}
		else {
			Node* rightNode = new Node(rch);
			nodes.emplace(rch, rightNode);
			head->right = rightNode;
		}
	}
	Node* head = nodes[root];
	cout << maxBstSize(head);
	return 0;
}

判断是否为完全二叉树

以某个结点为根的树列可能性:
1 左子树为满二叉树,右子树为满二叉树,左右子树高度一样,则为完全二叉树
2 左子树为完全二叉树,右子树为满二叉树,左子树高度等于右子树高度+1
3 左子树为满二叉树,右子树为满二叉树,左子树高度等于右子树高度+1
4 左子树为满二叉树,右子树为完全二叉树,左子树高度等于右子树高度
以上4中情况满足一个即为完全二叉树。
要想判断该树是否为完全二叉树,需要知道子树是否为满二叉树,是否为完全二叉树,子树的高度
信息类:

class Info {
public:
	bool isFull;
	bool isCBT;
	int height;
	Info(bool isFull,bool isCBT,int height):isFull(isFull),isCBT(isCBT),height(height){}
};
class Info {
public:
	bool isFull;
	bool isCBT;
	int height;
	Info(bool isFull,bool isCBT,int height):isFull(isFull),isCBT(isCBT),height(height){}
};
class Node {
public:
	int val;
	Node* left;
	Node* right;
	Node(int val):val(val) {
		left = NULL;
		right = NULL;
	}
};
Info* process(Node* root) {
	if (root == NULL) {
		return new Info(true, true, 0);
	}
	Info* leftInfo = process(root->left);
	Info* rightInfo = process(root->right);
	bool isFull = leftInfo->isFull && rightInfo->isFull && leftInfo->height == rightInfo->height;
	int height = max(leftInfo->height, rightInfo->height) + 1;
	bool isCBT = false;
	if (leftInfo->isFull && rightInfo->isFull && leftInfo->height == rightInfo->height) {
		isCBT = true;
	}
	else if (leftInfo->isFull && rightInfo->isFull && leftInfo->height == rightInfo->height + 1) {
		isCBT = true;
	}
	else if (leftInfo->isCBT && rightInfo->isFull && leftInfo->height == rightInfo->height + 1) {
		isCBT = true;
	}
	else if (leftInfo->isFull && rightInfo->isCBT && leftInfo->height == rightInfo->height) {
		isCBT = true;
	}
	return new Info(isFull, isCBT, height);

}
bool isCBTree(Node* root) {
	return process(root)->isCBT;
}


给定一个头结点head,和另外两个结点a和b,返回a和b的最低公共祖先

思路:以X结点为根的树,返回a和b的最低公共祖先
1 X不是最低公共祖先
①左子树上有答案
②右子树上有答案
③X这棵树没有a或者没有b,即没有答案
2 X是最低公共最先
①左子树有a或者b,右子树有另外一个
②X就是a,左子树或右子树上有b
③X就是b,左子树或者右子树上有a

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    class Info {
        public:
            bool findA;
            bool findB;
            TreeNode* ans;
            Info(bool findA,bool findB,TreeNode* ans):findA(findA),findB(findB),ans(ans){
            }
        };
    Info* process(TreeNode* root, TreeNode* a, TreeNode* b) {
        if (root == NULL) {
            return new Info(false, false, NULL);
        }
        Info* leftInfo = process(root->left, a, b);
        Info* rightInfo = process(root->right, a, b);
        bool findA = (root == a) || leftInfo->findA || rightInfo->findA;
        bool findB = (root == b) || leftInfo->findB || rightInfo->findB;
        TreeNode* ans = NULL;
        if (leftInfo->ans != NULL) {
            ans = leftInfo->ans;
        }
        else if (rightInfo->ans != NULL) {
            ans = rightInfo->ans;
        }
        else {
            if (findA && findB) {
                ans = root;
            }
        }
        return new Info(findA, findB, ans);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return process(root, p, q)->ans;
    }
};

派对的最大快乐值

题目描述:一个员工只有一个直接上级。也就是这个公司员工的层级结构就是一个多叉树。
现在公司邀请员工参加派对,要求不能同时邀请员工和员工的任一下级(即直接上下级不能同时邀请),如何邀请员工,才能使得参加派对的员工的快乐值是所有情况中最大的。最后返回最大的快乐值。
员工的定义如下:

class Employee {
public:
	int happy;
	vector<Employee*>nexts;
	Employee(int happy):happy(happy){}
};

思路:以x为根结点树,返回最大的快乐值
情况1 x来的话,返回最大值
最大值=x的快乐值+所有后代不来的最大值
情况2 x不来的话,返回最大值
最大值=所有后代来的最大值和不来的最大值最大的加起来

#include<iostream>
#include<vector>
using namespace std;

class Employee {
public:
	int happy;
	vector<Employee*>nexts;
	Employee(int happy):happy(happy){}
};
class Info {
public:
	int yes;
	int no;
	Info(int yes,int no):yes(yes),no(no){}
};
Info* process(Employee* root) {
	if (root == NULL) {
		return new Info(0, 0);
	}
	int yes = root->happy;
	int no = 0;
	for (Employee* e : root->nexts) {
		Info* next = process(e);
		yes += next->no;
		no += max(next->yes, next->no);
	}
	return new Info(yes, no);
}
int maxVal(Employee* root) {
	Info* allInfo = process(root);
	return max(allInfo->yes, allInfo->no);
}
int main() {
	return 0;
}
二叉树递归套路(3):判断是否是满二叉树、最大子搜索二叉树的节点数 文章目录一、判断是否是满二叉树1、递归套路思路2、递归套路代码二、求二叉树中最大子搜索二叉树的节点数1、递归套路思路2、递归套路代码三、二叉树递归套路总结 今天继续二叉树的递归套路。 一、判断是否是满二叉树 满二叉树定义:对于高度为h的二叉树,节点数为(2^h - 1) 1、递归套路思路 根据满二叉树的定义可以知道,我们每次只需要获取高度、节点数即可。 也就是每次从左子树和右子树中我们都需要 高度、节点数 两个数据,最后再根据高度和节点数的关系判断是否是满二叉树。所以可以定义如下的Info类 /** * 阅读详情

相关推荐

HUMAnN 3.0 (alpha)安装及使用

文章目录简介安装数据库下载运行参考 简介 安装 conda install humann humann_test (~1 minute) 数据库下载 humann_databases --download chocophlan full /path/to/databases --update-config yes humann_databases --download uniref uniref90_diamond /path/to/databases --update-config yes humann_

dys的博客 9505

8.二叉树的递归套路

二叉树的递归套路 可以解决面试中绝大多数(95%)的二叉树问题尤其是树型dp问题 本质是利用递归遍历二叉树的便利性 小技巧多如牛毛,大技巧就两个:二叉树的递归套路、暴力递归改动态规划的套路 所谓二叉树的递归套路就是在树上做动态规划,什么是动态规划呢?动态规划就是用时间换空间的方式。 二叉树的递归套路 1)假设以X节点为头,假设可以向X左树和X右树要任何信息 2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要) 3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息 4)把左树信息

Harrison的学习博客 547

移动硬盘报错0x80070570?5分钟搞定CHKDSK修复(附详细参数说明)

本文针对移动硬盘报错0x80070570问题,提供了详细的CHKDSK修复方法。通过5分钟核心修复流程,指导用户使用系统自带工具快速修复文件系统逻辑错误,恢复硬盘访问。文章还深入解析了CHKDSK参数,并提供了备选数据恢复方案与日常防护建议。

app77的博客 234

左神算法笔记(五)二叉树概念及递归套路

概念:对于每一棵子树来说,左树的节点都比它大,右树的节点都比它小【如何判断一棵树为搜索二叉树?

qq_26012469的博客 813

华为硬件工程师笔试题

1、基尔霍夫定理的内容是什么?(仕兰微电子)   基尔霍夫定理包括电流定律和电压定律。   电流定律(KCL):在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于零。   电压定律(KVL):在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。   2、平板电容公式(C=εS/4πkd)。(未知)   3、最基本的如三极管曲线特性。(未知)   4、描述反馈电路...

weixin_33717117的博客 2万+

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 516

【算法自由之路】二叉树的递归套路

二叉树的递归套路,直接解决树的 99% 的问题

dying 搁浅 612

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3296

二叉树的基本算法与递归套路(Java)

二叉树的一些算法

weixin_45036949的博客 726

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍 (1)输入参数:无 (2)输出参数:Xr和Yr是小车当前在世界坐标系下的坐标 (3)主要作用:作为ROS与MATLAB的通讯接口,从ROS中订阅小车当前的位置信息,并输出 (4)内部结构: (5)具体实现过程:通过ROS工具箱中的Subscribe模块从ROS中订阅话题/gazebo/link_statesa 通过Bus Selector模块选择ROS总线中的Pose

慕羽★的博客 2699

【左程云算法全讲7】二叉树基础算法及递归套路

系列综述:💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。🥰来源:材料主要源于进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。🤭结语:如果有帮到你的地方,就和!!🌈。

qq_43840665的博客 766

PyTorch生成式人工智能(1)——神经网络与模型训练过程详解

在本节中,我们介绍了传统机器学习与人工神经网络间的差异,并了解了如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现了反向传播以优化权重达到最小化损失值的目标。并实现了网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 1万+

使用二叉树的递归套路来解决的问题

如果当前节点左树右树都不为空,且左右树都是搜索二叉树,且当前节点值比左树最大值都大,比右树最小值要小,则以 root 为根节点的树是二叉搜索树。如果左右树都是满二叉树,且左右树的高度一致,那么当前节点为根节点的树一定是满二叉树,当然也是完全二叉树。如果左树是完全二叉树,右树是满二叉树,且左树高度比右树高度大1,此时当前节点为根节点的树也是完全二叉树。如果左树是满二叉树,右树是完全二叉树,且左右树的高度一致,此时当前节点为根节点的树也是完全二叉树。除此之外,以 root 为节点的二叉树都不是搜索二叉树。

Practitioner 443

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树的递归套路简介集合

二叉树递归 二叉树结构 中序遍历 查找后继节点 Class Node{ V value; Node left; Node right; Node parent; } 给你二叉树中的某个节点 ,返回该节点的后继节点 中序遍历顺序 左 头 右 中序遍历过程中 该节点中序遍历的下一个节点 递归序 表明每个节点访问三次 如果该节点是当前子树的左孩子 则后继节点就是其父节点。 如果该节点是当前子树的右孩子 向上寻找 出现父节点为曾父节点的左孩子时候 则该曾父节点就是该节点的后继节点 整颗树

acwing的博客 423

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

2022-003ARTS:二叉树的递归套路

ARTS:Algorithm、Review、Tip、Share Algorithm 算法题 Review 英文文章 Tip 回想一下本周工作中学到的一个小技巧 Share思考一个技术观点、社会热点、一个产品或是一个困惑 Algorithm 二叉树相关的题目中,很大一部分可以使用如下递归套路来解: 假设任意以X为头节点的树,可以向其左右子树获得任何信息; 在上一步的假设下,讨论以X为头节点的树,得到答案的可能性; 列出所有可能性后,确定到底需要向左树和右树要什么样的信息; 把左树信息和右树信息求全集.

Flash~ 838

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

二叉树递归套路:判断二叉树是否是完全二叉树、判断二叉树是否是平衡二叉树

判断二叉树是否是完全二叉树、判断二叉树是否是平衡二叉树使用常规的解法大家都会,但是你知道如何用递归套路来解吗?二叉树递归套路可以解决绝大多数的二叉树问题,尤其是树型dp问题,相信看完有不一样的收获……

Java和算法学习的博客 2403

二叉树汇总及二叉树递归套路

package BinaryTree import ( "fmt" "testing" ) type Node struct { Value int Left *Node Right *Node } /* 所有节点只能往下值,不能够形成环 二叉树先序、中序、后序遍历 先序:任何子树的处理顺序都是,先头节点、再左子树、然后右子树 中序:任何子树的处理顺序都是,先左子树、再头节点、然后右子树 后续:任何字数的处理顺序都是,先左子树、再右子树、然后头节点

Go的全部 263

04.二叉树的递归套路

二叉树的递归套路 二叉树的递归套路 1)假设以X节点为头,假设可以向X左树和X右树要任何信息 2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要) 3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息 4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S 5)递归函数都返回S,每一棵子树都这么要求 6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息 1.判断是否是平衡二叉树 public static boolean isCBT2(Node he

qq_45385121的博客 179

Java算法体系学习(九)二叉树的递归套路(搜索二叉树的判断、满二叉树的判断、平衡二叉树的判断、Morris中序遍历)

文章目录七、二叉树的递归套路1、判断一个树是不是平衡二叉树2、判断一个树是不是搜索二叉树2.1 非递归的中序遍历判断2.2 二叉树的递归套路2.3 Morris中序遍历3、判断一颗树是不是满树 七、二叉树的递归套路 二叉树的递归套路就是在递归遍历过程中,对于每一个节点,看能够给左树和右树分别要到什么信息,然后加工出自己的信息,层层递归,最后解出问题。 适用于只需要自己的左孩子和右孩子的信息就能加工出自己信息的问题,不必去深究左右子树的详细信息。 套路,看需要什么信息,就建一个信息类,然后遍历每一个节点,遇

weixin_45071560的博客 358

算法套路七——二叉树递归

该题与上题一样,递归思想基本一样,也是使用全局变量进行解决,不过该题在代码书写上值得注意,在go语言中只有值传递,当slice做为参数传递给函数的时候,新建了切片s,只是原始切片slice和参数s切片的底层数组是一样的,与Java不同,在Java中需要使用Lsit进行修改,且在函数结束前需要删除List的最后一个元素。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

Pistachiout的学习博客 1954
上一篇: 排序算法总结
下一篇: 【算法笔记】二叉树基本算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值