剑指offer--algorithm10

2018-05-15  本文已影响0人  strive鱼

老样子逛一逛,总有一些新发现。优秀的人总是能让你感觉到思维差异,思考方式的不同,决定愿意接触事物的不同,接触事物的不同,又决定你思维的高度和厚度,先mark书名--菜根谭记,书不在多,能静心读完枕边的书,才是最要紧的,这也是持盈保泰的体现方式吧,略读兄文,初做摘要,后续再读之。

动中静真 苦中乐真

静中静非真静,动处静得来,才是性天之真境;乐处乐非真乐,苦中乐得来,才是心体之真机。

富多施舍 智不炫耀

富贵家宜宽厚,而反忌刻,是富贵而贫贱其行矣!如何能享?聪明人宜敛藏,而反炫耀,是聪明而愚懵其病矣!如何不败?

杀气寒薄 和气福厚

天地之气,暖则生,寒则杀。故性气清冷者,受享亦凉薄;惟和气热心之人,其福亦厚,其泽亦长。

题20--从上往下,从左到右的打印二叉树
该题的解题思路画图如下:


image.png
image.png

下面为代码和注释部分

class treenode(object):
    def __init__(self,value):
        self.value=value
        self.left=None
        self.right=None#典型的构造树的方法
        
        
class solution(object):
    def printtree_top_to_bottom(self,root):#参数为根节点,或者说为遍历的开始节点
        queue=[]#声明一个队列
        result=[]#声明一个用于存储打印出的树的值的列表
        if root==None:
            return None#考虑一个边界的情况
        queue.append(root)
        while len(queue)>0:
            currentroot=queue.pop(0)#顺便将队列中的第一个弹出,实时更新队列
            result.append(currentroot.value)#将值写入列表中
            if currentroot.left!=None:
                queue.append(currentroot.left)#将左侧加入到队列的末尾
            if currentroot.right!=None:
                queue.append(currentroot.right)#将右侧加入到队列的末尾
        return result
    

def main():
    node1=treenode(8)
    node2=treenode(6)
    node3=treenode(10)
    node4=treenode(5)
    node5=treenode(7)
    node6=treenode(9)
    node7=treenode(11)
    node1.left=node2
    node1.right=node3
    node2.left=node4
    node2.right=node5
    node3.left=node6
    node3.right=node7
    s=solution()
    print (s.printtree_top_to_bottom(node1))
    
if __name__=='__main__':
    main()

题21--二叉搜索树的后续遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
如果是则输出Yes,不是则输出No 

关于这道题牵连到树的结构,右子树都比根节点大,左子树都比根节点小,二叉树可以只有左节点,或者只有右节点

image.png
image.png
下面为代码和注释部分

class solution(object):
    def realtree(self,sequence):#只有一个参数即为给出的序列结构
        if sequence==[]:
            return False#首先考虑边界问题
        root=sequence[-1]#根据书中的思路,第一个根节点应该为序列的最后一个
        if min(sequence)>root or max(sequence)<root:#说明root即是最小也是最大
            return True
        length=len(sequence)
        index=0#首先初始化索引值
        for i in range(length-1):
            index=i#这个语句不能放在if语句里边,否则,如果序列中的所有元素都小于最后一个元素,则下一个for 循环会发生检索值溢出的现象
            if sequence[i]>root:#说明检索到了第一层的右节点
                break#此时即便for 循环没有循环结束,也不再循环
            """
            至此,得到了右节点所在的索引值
            """
        for j in range(index+1,length-1):
            if sequence[j]<root:#这个时候说明不满足二叉树的结构,因为右节点的所有值必须大于根节点
                return False
            
        left=True
        if index>0:
            left=self.realtree(sequence[:index])#进行递归检查第二层,检测第二层左节点
            
        right=True
        if index<length-1:
            right=self.realtree(sequence[index:length-1])#进行递归检测第二层右节点
        return right and left#必须都为真,才能判断是一个合格的二叉树
            
    
    
def main():
    s=solution()
    #sequence=[5,7,6,9,11,10,8]
    #sequence=[4,6,7,5]
    sequence=[7,4,6,5]
    print (s.realtree(sequence))
    
    
if __name__=='__main__':
    main()

受到第21题的一些启示,编程最重要的是写代码之前的思路,思路的由来我想正是从一个或者多个简单的个例中得到的共性演变而来的,整个程序正是由这些共性转化为编程语言而来,最终再进一步核对逻辑性即可得到较为满意的程序代码

上一篇 下一篇

猜你喜欢

热点阅读