美文网首页
关于二叉树的一些

关于二叉树的一些

作者: 小小杨树 | 来源:发表于2021-09-30 10:45 被阅读0次

判断一棵二叉树是不是另一棵的子结构

from collections import deque


class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Tree(object):
    def __init__(self):
        self.root = None

    def construct_tree(self, values=None):
        if not values:
            return None
        self.root = TreeNode(values[0])
        queue = deque([self.root])
        leng = len(values)
        nums = 1
        while nums < leng:
            node = queue.popleft()
            if node:
                node.left = TreeNode(values[nums]) if values[nums] else None
                queue.append(node.left)
                if nums + 1 < leng:
                    node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
                    queue.append(node.right)
                    nums += 1
                nums += 1

    def bfs(self):
        ret = []
        queue = deque([self.root])
        while queue:
            node = queue.popleft()
            if node:
                ret.append(node.val)
                queue.append(node.left)
                queue.append(node.right)
        return ret

    def pre_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            ret.append(head.val)
            traversal(head.left)
            traversal(head.right)

        traversal(self.root)
        return ret

    def in_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            traversal(head.left)
            ret.append(head.val)
            traversal(head.right)

        traversal(self.root)
        return ret

    def post_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            traversal(head.left)
            traversal(head.right)
            ret.append(head.val)

        traversal(self.root)
        return ret


def sub_tree(tree1, tree2):
    if tree1 and tree2:
        if tree1.val == tree2.val:
            return sub_tree(tree1.left, tree2.left) and sub_tree(tree1.right, tree2.right)
        else:
            return sub_tree(tree1.left, tree2) or sub_tree(tree1.right, tree2)
    if not tree1 and tree2:
        return False
    return True


if __name__ == '__main__':
    t1 = Tree()
    t1.construct_tree([1, 2, 3, 4, 5])
    print(t1.bfs())
    t2 = Tree()
    t2.construct_tree([2, 4, 5])
    print(t2.bfs())
    print(sub_tree(t1.root, t2.root))

结果展示:

[1, 2, 3, 4, 5]
[2, 4, 5]
True

——————————————————————————————————————————————————————————————————————————

求二叉树的镜像

思路一:按层次遍历,每一层从右到左

思路二:递归遍历

from collections import deque


class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Tree(object):
    def __init__(self):
        self.root = None

    def construct_tree(self, values=None):
        if not values:
            return None
        self.root = TreeNode(values[0])
        queue = deque([self.root])
        leng = len(values)
        nums = 1
        while nums < leng:
            node = queue.popleft()
            if node:
                node.left = TreeNode(values[nums]) if values[nums] else None
                queue.append(node.left)
                if nums + 1 < leng:
                    node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
                    queue.append(node.right)
                    nums += 1
                nums += 1

    def bfs(self):
        ret = []
        queue = deque([self.root])
        while queue:
            node = queue.popleft()
            if node:
                ret.append(node.val)
                queue.append(node.left)
                queue.append(node.right)
        return ret


def mirror_bfs(root):
    ret = []
    queue = deque([root])
    while queue:
        node = queue.popleft()
        if node:
            ret.append(node.val)
            queue.append(node.right)
            queue.append(node.left)
    return ret


def mirror_pre(root):
    ret = []

    def traversal(root):
        if root:
            ret.append(root.val)
            traversal(root.right)
            traversal(root.left)
    traversal(root)
    return ret


if __name__ == '__main__':
    t = Tree()
    t.construct_tree([1, 2, 3, 4, 5, 6, 7])
    print(t.bfs())
    print(mirror_bfs(t.root))
    print(mirror_pre(t.root))

结果展示:

[1, 2, 3, 4, 5, 6, 7]
[1, 3, 2, 7, 6, 5, 4]
[1, 3, 7, 6, 2, 5, 4]

——————————————————————————————————————————————————————————————————————————

使用先序遍历和中序遍历的结果重建二叉树

from collections import deque


class TreeNode(object):
    """
    二叉树结点定义
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Tree(object):
    """
    二叉树
    """
    def __init__(self):
        self.root = None

    def bfs(self):
        ret = []
        queue = deque([self.root])
        while queue:
            node = queue.popleft()
            if node:
                ret.append(node.val)
                queue.append(node.left)
                queue.append(node.right)
        return ret

    def pre_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            ret.append(head.val)
            traversal(head.left)
            traversal(head.right)

        traversal(self.root)
        return ret

    def in_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            traversal(head.left)
            ret.append(head.val)
            traversal(head.right)

        traversal(self.root)
        return ret

    def post_traversal(self):
        ret = []

        def traversal(head):
            if not head:
                return
            traversal(head.left)
            traversal(head.right)
            ret.append(head.val)

        traversal(self.root)
        return ret


def construct_tree(preorder=None, inorder=None):
    """
    构建二叉树
    """
    if not preorder or not inorder:
        return None
    index = inorder.index(preorder[0])
    left = inorder[0:index]
    right = inorder[index+1:]
    root = TreeNode(preorder[0])
    root.left = construct_tree(preorder[1:1+len(left)], left)
    root.right = construct_tree(preorder[-len(right):], right)
    return root


if __name__ == '__main__':
    t = Tree()
    root = construct_tree([1, 2, 4, 7, 3, 5, 6, 8], [4, 7, 2, 1, 5, 3, 8, 6])
    t.root = root
    print(t.bfs())
    print (t.pre_traversal())
    print (t.in_traversal())
    print (t.post_traversal())

结果展示:

[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 4, 7, 3, 5, 6, 8]
[4, 7, 2, 1, 5, 3, 8, 6]
[7, 4, 2, 5, 8, 6, 3, 1]

————————————————————————————————————————————————————————————————————————

二叉树的一个小应用:双向链表排序

将二叉搜索树转化成一个排序的双向链表,只调整树中结点的指向,不用新结点中序遍历,根结点的left指向左子树的最后一个(最大)值,right指向右子树的(最小)值

非二叉搜索树,建树的时候values中的顺序需要注意 之后有时间会改成二叉搜索树

from collections import deque


class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Tree(object):

    def __init__(self):
        self.root = None

    def construct_tree(self, values=None):
        # 结点值不存在的话,values中用None表示
        if not values:
            return None
        self.root = TreeNode(values[0])
        queue = deque([self.root])
        leng = len(values)
        nums = 1
        while nums < leng:
            node = queue.popleft()
            if node:
                node.left = TreeNode(values[nums]) if values[nums] else None
                queue.append(node.left)
                if nums + 1 < leng:
                    node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
                    queue.append(node.right)
                    nums += 1
                nums += 1

    def bfs(self):
        ret = []
        queue = deque([self.root])
        while queue:
            node = queue.popleft()
            if node:
                ret.append(node.val)
                queue.append(node.left)
                queue.append(node.right)
        return ret


class Solution(object):

    @staticmethod
    def convert(tree):
        """结点转换"""
        if not tree:
            return None
        p_last = Solution.convert_nodes(tree, None)
        while p_last and p_last.left:  # 获取链表头结点
            p_last = p_last.left
        return p_last

    @staticmethod
    def convert_nodes(tree, last):
        if not tree:
            return None
        if tree.left:
            last = Solution.convert_nodes(tree.left, last)
        if last:
            last.right = tree
        tree.left = last
        last = tree
        if tree.right:
            last = Solution.convert_nodes(tree.right, last)
        return last

    @staticmethod
    def print_nodes(tree):
        # 正序链表打印
        ret = []
        while tree:
            tmp = []
            tmp.append(tree.left.val if tree.left else None)
            tmp.append(tree.val)
            tmp.append(tree.right.val if tree.right else None)
            ret.append(tmp)
            tree = tree.right
        print(ret)


if __name__ == '__main__':
    r = Tree()
    r.construct_tree([3, 5, 4, 8, 6, None, 7, 1])
    t = Solution.convert(r.root)
    Solution.print_nodes(t)

相关文章

  • 二叉树

    一些关于二叉树的简单操作 创建节点 简单操作

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 数据结构与算法学习-二叉查找树

    之前整理了两篇关于二叉树的文章: 征战二叉树-第一站 征战二叉树-第二站 这两篇都是基于二叉树,以及一些练习题,本...

  • 一篇文章搞定面试中的二叉树题目(java实现)

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。先上二叉树的数据结构: 二叉树的题目普遍可以...

  • 一篇文章搞定面试中的二叉树题目(java实现)

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。 先上二叉树的数据结构: 二叉树的题目普遍可...

  • 二叉树常见面试题

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。先上二叉树的数据结构: 二叉树的题目普遍可以...

  • 关于二叉树的一些

    判断一棵二叉树是不是另一棵的子结构 结果展示: —————————————————————————————————...

  • PHP二叉树之前序、中序、后序遍历

    关于PHP里二叉树如何构建请阅读:PHP二叉树之构建二叉树[https://www.jianshu.com/p/d...

  • 1、树的一些基本概念: 2、二叉树:   1、两种特殊的二叉树   2、满二叉树:

  • 二叉树及其遍历

    二叉树及其遍历 二叉树概念定义 什么是二叉树 二叉树特点是每个节点最多只能有两棵子树,且有左右之分的树。 注:关于...

网友评论

      本文标题:关于二叉树的一些

      本文链接:https://www.haomeiwen.com/subject/wrcenltx.html