![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
aaaqqq1234
这个作者很懒,什么都没留下…
展开
-
二叉树的最大路径和
我们先定义一个全局变量res=flaot("-inf")来存储全局的最大值,也就是我们需要返回的值对于节点值为20的节点,我们考虑的是对于以这个节点为根节点的路径的最大值是多少我们有这么几种几种情况:1.根节点自己就是最大的,不需要加上左右子树的路径2.根节点加上左子树的最大路径是最大3.根节点加上右子树的最大路径是最大的4.根节点加上左右子树的最大路径是最大的我们每次判断下这几个变量的最大值,就是以当前节点为根节点的路径的最大值# Definition for a binary tree原创 2020-09-15 11:46:26 · 97 阅读 · 0 评论 -
建立二叉树(非二叉搜索树)
class TreeNode(object): def __init__(self,item=None,left=None,right=None): self.item = item self.left = left self.right = rightclass BinaryTree(object): # 创建二叉树 def __init__(self): self.root = None # 根结点 def a原创 2020-09-14 15:40:08 · 78 阅读 · 0 评论 -
二叉树有多少种
给一个整数n,求1,2.。。n为节点组成的二叉搜索树有多少种?def numtree(n): res = [0] * (n+1) res[0] = 1 res[1] =1 for i in range(2,n+1): for j in range(1,i+1): res[i] += res[j-1] * res[i-j] return res[n]a = numtree(3)print(a)...原创 2020-09-11 11:19:02 · 268 阅读 · 0 评论 -
判断一棵树是不是另一棵树的子树
题目判断b是不是a的子树思路先判断根节点是否一样,若一样则递归判断左右子树,若不一样就用b的根节点去比较a的左右子树。代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def HasSubtree(self, p原创 2020-08-12 15:57:26 · 203 阅读 · 0 评论 -
找二叉树的节共同祖先点的
题目找二叉树一个节点的最近的共同祖先思路从根节点开始,如果当前根节点等于p或q,则说明找到了一个,返回当前根节点,递归查找当前根节点的左右节点。,代码 def lowcommonanc(self,p,q): return self.lowcommonanc_helper(self.root,p,q) def lowcommonanc_helper(self,node,p,q): if node is None: return None if node._i原创 2020-07-24 23:45:32 · 60 阅读 · 0 评论 -
打印树的和的路径
题目给定一个二叉树,找到从根节点到叶子节点的和与给定目标相等的路径思路从根节点开始,遍历每一条路径,每走过一个节点,就把目标值减去这个节点的值,当最后一个节点没有左右孩子且这个节点的值等于剩余的目标值,就返回这个路径,用一个局部list存当前路径。 def sum(self,target): return self.sum_helper(self.root,target) def sum_helper(self,node,target): if node is None:原创 2020-07-24 21:02:00 · 87 阅读 · 0 评论 -
链表转二叉树
题目链表转二叉树思路找到链表的中点,然后递归代码def linkedlist_tree(link): if link is None: return None dummy = Node_L(None,0) dummy.next = link link = dummy fast = link slow = link pre = link while fast and fast.next is not None: pre = slow fast原创 2020-07-24 18:32:10 · 156 阅读 · 0 评论 -
根据数组构造二叉搜索树
题目给定一个排好序的数组,去构造二叉排序树array = [10,-3,0,5,9]思路找到数组的中点,然后递归构造左右树。代码def array_build_tree(array): if len(array) == 0: return None mid = len(array)//2 root = Node(array[mid]) root._left = array_build_tree(array[:mid]) root._right = array_bu原创 2020-07-24 17:03:32 · 1350 阅读 · 0 评论 -
构造二叉树
题目给定两种遍历,构造二叉树preorder = [3,9,20,15,7]inorder = [9,3,15,20,7]思路根据先序遍历找root节点,到中序里找到root节点的index,然后再到中序遍历里找左右,然后递归。代码def built_tree(pre,inorder): if inorder: root_index = inorder.index(pre.pop(0)) root = Node(inorder[root_index]) root._原创 2020-07-24 16:14:06 · 130 阅读 · 1 评论 -
二叉树非递归
题目iterative的方法构造二叉树思路1.构造二叉搜索树,先创建一个新的节点,如果没有根节点,则创建一个根节点,然后在创建一个当前节点和父节点,用父节点记录当前节点的位置,然后判断插入的节点值和当前节点值的大小,若当前节点为空,则插入。查找功能,先从根节点开始,然后判断大小,若大,则去找右节点,若小,则去找左节点。3.中序遍历,从根节点开始,一直探索左孩子,当遇到空节点时,就弹出栈,再去访问他的右节点。4.先序遍历,从根节点开始,先入栈,栈不为空时,在出栈,打印,然后先进右节点,再进左节原创 2020-07-24 14:00:35 · 79 阅读 · 0 评论 -
判断一课树是否是可折叠
题目可折叠的树是中线对称的思路对于一课可折叠的树,左边节点的左孩子和右边节点的右孩子要同时不存在或不存在,或者左节点的右孩子和右节点的左孩子同时不存在或者不存在。代码def isfoldable(self): return self.__isfoldable(self.root._left,self.root._right) def __isfoldable(self,nodeA,nodeB): if nodeA is None and nodeB is None:原创 2020-07-23 17:36:56 · 94 阅读 · 0 评论 -
判断两棵树是否是一样的
题目判断两棵树是否是一样的树思路递归判断左右节点以及值是否一样代码 def issametree(self,anther): return self.__issametree(self.root,anther.root) def __issametree(self,nodeA,nodeB): if nodeA is None and nodeB is None: return True if nodeA is not None and nodeB is n原创 2020-07-23 17:05:16 · 101 阅读 · 0 评论 -
树的反转
题目树反转思路递归调用,先反转左边,在反转右边。代码 def mirror(self): self.__mirror(self.root) def __mirror(self,node): if node is not None: self.__mirror(node._left) self.__mirror(node._right) temp = node._left node._left = node._right原创 2020-07-23 16:34:28 · 182 阅读 · 0 评论 -
判断一棵树是不是二分查找树
题目判断一棵树是不是二分查找树思路递归判断左边是不是BST,右边是不是BST,对于每个节点,都给他一个minsize,maxsize。代码def isBST(self): return self.__isBST(self.root,-float('inf'),float('inf')) def __isBST(self,node,minsize,maxsize): if node is None: return True if node._item <原创 2020-07-23 16:17:38 · 263 阅读 · 0 评论 -
数的floor
题目给定一个value,找到二叉树中最大的小于value的节点思路用递归的方法,如果value小于node的值,那么就左递归,遇到第一个小于value的node,那么用t记录node的右递归。代码 def floor(self, value): return self.__floor(self._root, value) def __floor(self, node, value): if node is None: retu原创 2020-07-22 23:10:02 · 82 阅读 · 0 评论 -
平衡树
题目平衡树:左子树和右子树的高度是否相差1思路对于每一个子节点,求出最大深度和最小深度,然后判断差是否大于1class binary_search_tree: def __init__(self,root=None): self.root = root def add(self,value): self.root = self.__add(self.root,value) def __add(self,node,value): if node is None:原创 2020-07-22 20:02:19 · 75 阅读 · 0 评论 -
求二叉树的深度
题目求二叉树的深度思路递归先求左子树的深度,再求右子树的深度,最后+1代码class binary_search_tree: def __init__(self,root=None): self.root = root def add(self,value): self.root = self.__add(self.root,value) def __add(self,node,value): if node is None: return Node原创 2020-07-22 17:34:36 · 187 阅读 · 0 评论 -
二叉搜索树
题目计算一棵数的大小思路递归先计算左子树,在右子树最后+1代码class binary_search_tree: def __init__(self,root=None): self.root = root def add(self,value): self.root = self.__add(self.root,value) def __add(self,node,value): if node is None: return Node(value原创 2020-07-22 17:25:21 · 83 阅读 · 0 评论