• 二叉树的中序遍历


    题目:给定一个二叉树,返回它的中序 遍历。

    来源:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

    法一:网上的代码

    思路:利用栈的递归,对每次取的节点进行标记,第一次遍历该节点时,标记为灰色,左子树和右子树标记为白色,注意入栈的顺序是右 中 左,因为最后存储的顺序的左 中 右.

    # Definition for a binary tree node.
    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    class Solution:
        def inorderTraversal(self, root: TreeNode):
            print('root is:')
            print(root)
            WHITE, GRAY = 0, 1
            res = []
            stack = [(WHITE, root)]
            while stack:
                color, node = stack.pop()
                # 如果节点为空则结束本次循环,继续从栈从取元素
                if node is None: continue
                if color == WHITE:
                    # 注意这里为了实现中序遍历,入栈的顺序是右 中 左
                    stack.append((WHITE, node.right))
                    stack.append((GRAY, node))
                    stack.append((WHITE, node.left))
                # 如果不为白色,说明已经被遍历过了,则放入res中
                else:
                    res.append(node.val)
            return res
    # 将list转化为二叉树
    # 这里是用队列实现了一个层序遍历,即将list从左往右一层一层依次填充二叉树
    def stringToTreeNode(input):
        input = input.strip()
        input = input[1:-1]
        if not input:
            return None
        inputValues = [s.strip() for s in input.split(',')]
        root = TreeNode(int(inputValues[0]))
        nodeQueue = [root]
        front = 0
        index = 1
        while index < len(inputValues):
            node = nodeQueue[front]
            # front指向的是队列的头,即出队列的
            front = front + 1
            item = inputValues[index]
            index = index + 1
            if item != "null":
                leftNumber = int(item)
                node.left = TreeNode(leftNumber)
                nodeQueue.append(node.left)
            if index >= len(inputValues):
                break
            item = inputValues[index]
            index = index + 1
            if item != "null":
                rightNumber = int(item)
                node.right = TreeNode(rightNumber)
                nodeQueue.append(node.right)
        return root
    import json
    def integerListToString(nums, len_of_list=None):
        if not len_of_list:
            len_of_list = len(nums)
        return json.dumps(nums[:len_of_list])
    def main():
        import sys
        import io
        # 实现了交互功能
        def readlines():
            for line in io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8'):
                yield line.strip('
    ')
        lines = readlines()
        while True:
            try:
                line = next(lines)
                root = stringToTreeNode(line);
                ret = Solution().inorderTraversal(root)
                out = integerListToString(ret);
            except StopIteration:
                break
    if __name__ == '__main__':
        main()
    View Code

     

  • 相关阅读:
    JavaScript 操作注意事项(此日志持续更新)
    JavaScript省市级联
    Outlook 2013 中添加 live.cn 帐户
    readonly, const, static, static readonly 关键字实例说明
    Windows 8 应用开发常见问题及解决方案(持续更新)
    【转】用C#动态创建Access数据库
    使用 Layer 弹出 iframe 层,并让 iframe 自适应内容宽高
    Visual Studio 常见问题及解决方案(持续更新)
    Python核心编程学习日记之模块
    Python核心编程学习日记之函数式编程
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11922021.html
Copyright © 2020-2023  润新知