--------------python数据结构
文章平均质量分 66
有一种宿命叫无能为力
即便梦想依旧遥不可及,我依然矢志不渝的前进
原博客链接:http://blog.csdn.net/wuxiushu
展开
-
完全二叉树的结点总数问题
一颗完全二叉树第六层有8个叶结点(根为第一层),则结点个数最多有()个。二叉树第k层最多有 2^(k-1) 个节点第六层最多有32个节点第五层最多有16个节点第四层最多有8个节点第三层最多有4个节点第二层最多有2个节点 第一层最多有1个节点完全二叉树的叶节点只可能出现在后两层如果完全二叉树有6层,则前5层是满二叉树,总节点数目为1原创 2017-02-12 21:03:10 · 12004 阅读 · 0 评论 -
二叉树的下一个结点(二叉树中序遍历的使用)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,原创 2017-01-29 00:08:08 · 867 阅读 · 0 评论 -
单链表的基本操作(python)
用python实现单链表的增删改查#!/usr/bin/python#coding: utf-8class Node(object): "数据域" def __init__(self, data, next = 0): self.data = data self.next = nextclass LinkList(object): "处理类" def __init__原创 2017-01-21 13:14:29 · 1941 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。题意分析:链表的输出操作# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回从原创 2017-01-24 18:15:34 · 242 阅读 · 0 评论 -
链表中环的入口结点(单链表)
题目描述一个链表中包含环,请找出该链表的环的入口结点。把所有结点依次存入列表中,每一次存入之前进行判断该结点在链表中是否出现过即可。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = None原创 2017-01-29 00:20:59 · 323 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路一:两条相交的链表呈Y型。可以从两条链表尾部同时出发,最后一个相同的结点就是链表的第一个相同的结点。可以利用栈来实现。时间复杂度有O(m + n), 空间复杂度为O(m + n)# -*- coding:utf-8 -*-# class ListNode:# def __init__(self,原创 2017-01-25 17:08:12 · 299 阅读 · 0 评论 -
双向链表的基本操作(python)
用python实现单链表的增删改查#!/usr/bin/python#coding: utf-8class Node(object): u"数据类" def __init__(self, data, p = 0): self.data = data self.next = p self.prev = pclass Linklist(object): u"操作类"原创 2017-01-26 10:54:53 · 560 阅读 · 0 评论 -
删除链表中重复的结点(单链表)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5递归,遇到重复的则先把重复的剔除,再把指针后移,没有遇到就直接后移即可。# -*- coding:utf-8 -*-# class ListNode:# def __init__(原创 2017-01-29 00:44:52 · 923 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: #原创 2017-01-24 23:56:46 · 326 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路:pHead始终指向要反转的结点last 指向反转后的首结点每反转一个结点,把pHead结点的下一个结点指向last, last指向pHead成为反转后首结点, 再把pHead向前移动一个结点直至None结束# -*- coding:utf-8 -*-# class ListNode原创 2017-01-24 23:16:30 · 214 阅读 · 0 评论 -
获取链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。题意分析:注意输出的是结点,并不是结点对应的元素# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:原创 2017-01-24 23:04:00 · 294 阅读 · 0 评论 -
复杂链表的复制(注意深拷贝和浅拷贝的区别)(特殊的双向链表)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)题意分析:题目里面说明,不要返回结点的引用,如果这样做了会返回为空。其实说的就是浅拷贝深拷贝和浅拷贝的区别如下??简单的来说就是,在有原创 2017-01-29 12:00:10 · 4211 阅读 · 0 评论 -
二叉搜索树与双向链表(二叉搜索树转化为双向链表)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题意分析:题目中并没有明确说明是转化为从小到大排序的双向链表还是从大到小的双向链表,所以估摸着应该都对,这里是从小到大排序的。定义一个全局变量,用来指向左子树的最后一个结点# -*- coding:utf-8 -*-class TreeNo原创 2017-01-29 17:25:51 · 683 阅读 · 0 评论 -
二叉树的创建以及四种遍历,叶子结点的数量,二叉树深度(简单二叉树)
前序遍历:DLR中序遍历:LDR后序遍历:LRD这三种遍历都采用递归的形式层次遍历:从上到下,从左到右依次遍历这种遍历采用队列的形式#!/usr/bin/python#coding: utf-8class Tree_Node(object): def __init__(self, val = "#"): self.val = val self.le原创 2017-01-27 13:03:13 · 975 阅读 · 0 评论 -
二叉搜索树的创建,结点删除和查找(二叉搜索树)
对于二叉查找树的每个节点Node,它的左子树中所有的关键字都小于Node的关键字,而右子树中的所有关键字都大于Node的关键字。二叉查找树的平均深度是O(log N)。1.初始化class BinarySearchTree(object): def __init__(self,key): self.key=key self.left=No原创 2017-01-29 21:11:33 · 734 阅读 · 0 评论 -
链表的回文结构(链表操作)
题目描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true简单题,判断是否是回文串即可# -*- coding:utf-8 -*-# class ListN原创 2017-02-03 21:54:35 · 373 阅读 · 0 评论 -
对称的二叉树(二叉树的镜像操作)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。判断二叉树的对称性,就是把左右子树对应位置的元素进行判断是否相同,如果相同,返回False,否则,返回True如果说二叉树本身为空,也返回False本题与二叉树的镜像(链接)极其相似,思路可以说基本上相同。# -*- coding:utf-8 -原创 2017-01-28 22:31:52 · 458 阅读 · 0 评论 -
二叉搜索树的后序遍历序列(二叉搜索树的应用)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二叉搜索树满足左孩子的每一个结点都小于根结点,右孩子的每一个结点都大于根结点。由于是后序遍历,所以根结点在最后的位置。获取到根结点,通过根结点把左子树和右子树分开,如果左子树和右子树的每个结点的值都满足二叉搜索树的条件(左原创 2017-01-28 21:56:16 · 727 阅读 · 1 评论 -
二叉树的镜像(二叉树的对称性)
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2017-01-28 21:05:22 · 642 阅读 · 0 评论 -
完全二叉树的叶子节点总数问题
设一颗完全二叉树共有1699个结点,则该二叉树中叶子结点数(度为0)为?解析:在二叉树中有关系:度为0的结点个数 = 度为2的结点个数 + 1,表示为:n0 = n2 +1;因为度为1的结点只可能出现在最后一个结点,或者根本就不存在度为1的结点。假设:存在度为1的结点;n0 + n2 + 1 = 1699,解其可得,n0 与 n2 都不为整数,这与事实不符,所以可以得出原创 2017-02-12 21:15:03 · 6127 阅读 · 0 评论 -
怎么判断一个序列是不是堆?
已知一个序列,比如{100,6070,50,32,65},怎么判断是不是堆?答案:把这个序列看成数组型的二叉树,如果根结点是i,左子树是2*i,右子树是2*i+1。堆分为最大堆与最小堆。最大堆中所有父节点都比左子树、右子树大,比如已知序列,画成堆就是: 所以已知序列是个最大堆。最小堆中所有父节点都比左子树、右子树小,比如{32,50,60,70原创 2017-02-13 20:36:49 · 3296 阅读 · 0 评论 -
已知二叉树的前序遍历和中序遍历重建二叉树(二叉树)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二叉树前序遍历中,第一个元素总是根节点的值,中序遍历,左子树的结点的值位于根节点值的左边,右子树的节点的值位于根节点值的右边。原创 2017-01-27 15:10:46 · 1543 阅读 · 0 评论 -
已知二叉树的后序遍历和中序遍历重建二叉树(二叉树)
由中序遍历和后序遍历重建二叉树中序遍历中,根节点总是位于左右子树中间,将左右子树分开。后序遍历中,根节点总是在左右子树之后。重建算法:现在说一下重建根节点的过程,其他节点可以递归建立。由后序遍历定义可知,后序遍历序列的最后一个元素必定是整个树的根节点,这样就确定了根节点。由中序遍历定义可知,在中序遍历中查找根节点,可以确定根节点在中序遍历序列中位置,这样就可以将中序遍历原创 2017-01-28 10:20:11 · 3521 阅读 · 0 评论 -
已知二叉树的前序遍历和中序遍历求后序遍历(二叉树)
二叉树每一个结点的值都不相同分析:二叉树的题目基本上都是要用递归的。而递归的核心是找到结构相同的子问题。二叉树如下所示: a ↙ ↘ b c ↙↘ ↘ d e g前序: abdecg中原创 2017-01-28 12:02:49 · 1212 阅读 · 0 评论 -
已知二叉树的后序遍历和中序遍历求前序遍历(二叉树)
已知后序遍历和中序遍历重建二叉树和已知前序遍历和中序遍历求后序遍历的时候已经说明思路,这里直接贴代码# -*- coding:utf-8 -*- class Solution(object): def reConstructBinaryTree(self, post, mid): if len(post) == 0 or len(mid) == 0: return None原创 2017-01-28 12:16:57 · 1869 阅读 · 0 评论 -
把二叉树打印成多行(二叉树的层次遍历)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。二叉树的层次遍历,对于每一层的元素放在同一个列表中即可# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2017-01-28 13:00:46 · 515 阅读 · 0 评论 -
二叉树的深度(二叉树)
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。依题意可知:求当前二叉树的深度# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x#原创 2017-01-27 14:00:54 · 674 阅读 · 0 评论 -
从上往下打印二叉树(二叉树)
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。由题目很容易知道,层次遍历,用列表模拟队列操作即可# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2017-01-27 13:51:14 · 384 阅读 · 0 评论 -
树的子结构(二叉树)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right =原创 2017-01-28 13:52:39 · 447 阅读 · 0 评论 -
二叉树中和为某一值的路径(二叉树+DFS)
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。找出和满足某一值的所有的路径# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x#原创 2017-01-28 14:44:47 · 362 阅读 · 0 评论 -
平衡二叉树(二叉树深度+DFS)
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树:又称AVL树,具有如下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树(即每一个结点的左右子树)。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):#原创 2017-01-28 15:56:58 · 629 阅读 · 0 评论 -
按之字形顺序打印二叉树(二叉树的层次遍历)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。和把二叉树打印成多行类似,都是对二叉树的层次遍历,只不过这个题要求正序逆序交叉输出# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):原创 2017-01-28 16:14:53 · 635 阅读 · 0 评论 -
二叉搜索树的第k个结点(二叉搜索树结点查找)
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所原创 2017-01-28 17:59:00 · 1293 阅读 · 0 评论 -
序列化二叉树(二叉树的序列化和反序列化)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solut原创 2017-01-28 19:43:07 · 1962 阅读 · 0 评论 -
字典树的基本操作
字典树的添加,删除以及查找,数量统计#!/usr/bin/python#coding: utf-8class TrieNode(object): def __init__(self): self.is_word = False # 判断是否是单词 self.children = [None] * 256class Trie(object):原创 2017-02-04 14:12:57 · 409 阅读 · 0 评论