二叉树判等IsSame Tree python实现

这篇博客介绍了如何用Python实现判断两个二叉树是否相等的算法,包括先根序遍历的方法和递归的外函数方法,并提供了测试过程。
摘要由CSDN通过智能技术生成

获,成长。

废话不多说,又遇到二叉树相关的题,题目虽简单,但用到些经典思路,所以记录下:

判断两个二叉树是否相等

class Node():
    def __init__(self,val,left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

    def IsSame(self, node):

#以上为题干部分, 下面采用先根序遍历(复杂度O(n)=2n)的方法来实现:

        p, q = self, node
        S0 = [] #栈0
        S1 = [] #栈1
        while (p and q) or len(S0):
            if p and q:
                if p.val != q.val:
                    return False
                S0.append(p.right)  #存右置左
                p = p.left
                S1.append(q.right)
                q = q.left
            p = S0.pop()
            q = S1.pop()
            if (p and (not q))or((not p)and q): #有一个不为None
                return False</

好的,我记录下来了。以下是使用 Python 实现二叉树的链式存储结构和递归算法的代码: ```python class TreeNode: def __init__(self, data): self.data = data self.left = None self.right = None class BinaryTree: def __init__(self): self.root = None def create_tree_from_input(self, input_str): input_list = input_str.split() node_list = [] for i in range(len(input_list)): if input_list[i] != '#': node = TreeNode(int(input_list[i])) node_list.append(node) if i == 0: self.root = node else: if i % 2 == 1: node_list[(i-1)//2].left = node else: node_list[(i-1)//2].right = node def create_tree_from_post_and_inorder(self, postorder, inorder): if not postorder or not inorder: return None root_val = postorder[-1] root = TreeNode(root_val) index = inorder.index(root_val) root.left = self.create_tree_from_post_and_inorder(postorder[:index], inorder[:index]) root.right = self.create_tree_from_post_and_inorder(postorder[index:-1], inorder[index+1:]) self.root = root return root def preorder(self, root): if root: print(root.data, end=' ') self.preorder(root.left) self.preorder(root.right) def inorder(self, root): if root: self.inorder(root.left) print(root.data, end=' ') self.inorder(root.right) def postorder(self, root): if root: self.postorder(root.left) self.postorder(root.right) print(root.data, end=' ') def count_leaves(self, root): if not root: return 0 if not root.left and not root.right: return 1 return self.count_leaves(root.left) + self.count_leaves(root.right) def swap_left_and_right(self, root): if root: temp = root.left root.left = root.right root.right = temp self.swap_left_and_right(root.left) self.swap_left_and_right(root.right) def is_same_tree(self, root1, root2): if not root1 and not root2: return True if not root1 or not root2: return False if root1.data != root2.data: return False return self.is_same_tree(root1.left, root2.left) and self.is_same_tree(root1.right, root2.right) def copy_tree(self, root): if not root: return None new_root = TreeNode(root.data) new_root.left = self.copy_tree(root.left) new_root.right = self.copy_tree(root.right) return new_root def draw_tree(self, root): if not root: return None node_list = [(root, 0)] cur_level = 0 res = '' while node_list: node, level = node_list.pop(0) if level > cur_level: res += '\n' cur_level = level res += str(node.data) + ' ' if node.left: node_list.append((node.left, level+1)) if node.right: node_list.append((node.right, level+1)) print(res) ``` 其中,`TreeNode` 类表示二叉树的节点,`BinaryTree` 类表示二叉树,其中包含了二叉树的创建、遍历、节点数、交换左右子树、判断是否相同、复制、绘制等功能。 例如,使用 `create_tree_from_input` 方法创建二叉树: ```python tree = BinaryTree() tree.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree.draw_tree(tree.root) ``` 输出: ``` 5 3 8 1 4 10 ``` 使用 `create_tree_from_post_and_inorder` 方法根据后序遍历和中序遍历创建二叉树: ```python tree = BinaryTree() tree.create_tree_from_post_and_inorder([1, 4, 3, 10, 8, 5], [1, 3, 4, 5, 8, 10]) tree.draw_tree(tree.root) ``` 输出: ``` 5 3 8 1 4 10 ``` 使用 `preorder`、`inorder`、`postorder` 方法遍历二叉树: ```python tree = BinaryTree() tree.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree.preorder(tree.root) # 5 3 1 4 8 10 tree.inorder(tree.root) # 1 3 4 5 8 10 tree.postorder(tree.root) # 1 4 3 10 8 5 ``` 使用 `count_leaves` 方法计算二叉树的叶子节点数: ```python tree = BinaryTree() tree.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') print(tree.count_leaves(tree.root)) # 3 ``` 使用 `swap_left_and_right` 方法交换二叉树的左右子树: ```python tree = BinaryTree() tree.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree.swap_left_and_right(tree.root) tree.draw_tree(tree.root) ``` 输出: ``` 5 8 3 # 10 4 1 ``` 使用 `is_same_tree` 方法判断两棵二叉树是否相同: ```python tree1 = BinaryTree() tree1.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree2 = BinaryTree() tree2.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree3 = BinaryTree() tree3.create_tree_from_input('5 3 8 1 4 # 10 # # # # # 7') print(tree1.is_same_tree(tree2.root, tree3.root)) # False ``` 使用 `copy_tree` 方法复制二叉树: ```python tree1 = BinaryTree() tree1.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree2 = BinaryTree() tree2.root = tree2.copy_tree(tree1.root) tree2.draw_tree(tree2.root) ``` 输出: ``` 5 3 8 1 4 10 ``` 使用 `draw_tree` 方法绘制二叉树: ```python tree = BinaryTree() tree.create_tree_from_input('5 3 8 1 4 # 10 # # # # # #') tree.draw_tree(tree.root) ``` 输出: ``` 5 3 8 1 4 10 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值