zoukankan      html  css  js  c++  java
  • 剑指offer 二叉树的下一个节点

    剑指offer 牛客网 二叉树的下一个节点

    结合图,我们可发现分成两大类:

    1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G)

    2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。

    # -*- coding: utf-8 -*-
    """
    Created on Wed Apr 10 10:52:32 2019
    
    @author: Administrator
    题目描述
    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
    注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
    思路:
    中序遍历的规则是:左根右
    分析二叉树的下一个节点,一共有以下情况:
    1.二叉树为空,则返回空;
    2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,
        一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
    3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;
        否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。
    """
    
    # -*- coding:utf-8 -*-
    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
            self.next = None                #指向父节点
    class Solution:
        def GetNext(self, pNode):
            # write code here
            if not pNode:                   #若为空,则直接返回其节点
                return pNode
            if pNode.right:                 #假如有右节点,则下个节点是右孩子的左子节点
                node = pNode.right          
                while node.left:            #直到遇左节点为空便返回
                    node = node.left
                return node
            while pNode.next:               #去寻找父亲节点
                temp = pNode.next
                if temp.left == pNode:      #直到左孩子是其节点便返回
                    return temp
                pNode = temp
    
    if __name__ == '__main__':
        solution = Solution()
        #1 2 3 4 5 6 7 8 9 #根节点是4
        n = TreeNode(9)
        node = TreeNode(8)
        node_left = TreeNode(1)
        node_right = TreeNode(3)
        node.left = n
        node_left.left = node
        root_left = TreeNode(2)
        root_left.left = node_left
        root_left.right = node_right
        
        node_left = TreeNode(5)
        node_right = TreeNode(7)
        root_right = TreeNode(6)
        root = TreeNode(4)
        root.left = root_left
        root_right.left = node_left
        root_right.right = node_right
        root.right = root_right
        
        res = solution.GetNext(root)
        print(res.val)  #5
  • 相关阅读:
    百度缓存
    thrift文件编写
    thrift初窥
    Shutil模块介绍
    多线程访问网站的爬虫的问题
    点滴记录python linux中的个人经验
    Yii框架的form处理
    使scrapy支持ftp下载
    mojoportal学习——文章翻译之站点图标
    mojoportal学习之特色模块对Artisteer2.4生成的模板的支持
  • 原文地址:https://www.cnblogs.com/missidiot/p/10683131.html
Copyright © 2011-2022 走看看