IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构和算法系列(1)——二叉树常用算法总结(python) -> 正文阅读

[数据结构与算法]数据结构和算法系列(1)——二叉树常用算法总结(python)

二叉树的递归思想很重要,还有递归的复杂度分析
华为云博客链接:https://bbs.huaweicloud.com/blogs/254847
个人博客连接:https://dlc1994.github.io/2019/03/09/ckqgsek2p0003t0ve29qowyjt/

1.1 二叉树的初始化

#initial of BinaryTree
class BinaryTree:
    def __init__(self,rootObj):
        self.val = rootObj
        self.left = None
        self.right = None

    def insertLeft(self,newNode):
        if self.left == None:
            self.left = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.left = self.left
            self.left = t

    def insertRight(self,newNode):
        if self.right == None:
            self.right = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.right = self.right
            self.right = t

1.2 创建一个二叉树

#create a BinaryTree [18,7,11,3,4,5,6,#,#,#,#,1,3,2,4]
#  18
# 7  11
#3 4 5 6
#   1 3 2 4

root = BinaryTree(18)
root.left = BinaryTree(7)
root.right = BinaryTree(11)
root.left.left = BinaryTree(3)
root.left.right = BinaryTree(4)
root.right.left = BinaryTree(5)
root.right.right = BinaryTree(6)
root.right.left.left = BinaryTree(1)
root.right.left.right = BinaryTree(3)
root.right.right.left = BinaryTree(2)
root.right.right.right = BinaryTree(4)

1.3 前序遍历

#递归版本
def PreOrder(self, node):
    if node:
        print(node.val)
        self.PreOrder(node.left)
        self.PreOrder(node.right)
#循环版本
def PreOrderLoop(self, node):
    if node == None:
        return
    stack =[]
    print(node.val)
    stack.append(node)
    node = node.left
    while stack!=[] or node:
        while node:
            print(node.val)
            stack.append(node)
            node = node.left
        node = stack[-1].right
        stack.pop()

#ouput: 18 7 3 4 11 5 1 3 6 2 4 

1.4 中序遍历

#递归版本
def InOrder(self, node):
    if node:
        self.InOrder(node.left)
        print(node.val)
        self.InOrder(node.right)
#循环版本
def InOrderLoop(self, node):
    if node == None:
        return None
    stack = []
    stack.append(node)
    node = node.left
    while stack!=[] or node:
        while node:
            stack.append(node)
            node = node.left
        print(stack[-1].val)
        node = stack[-1].right
        stack.pop()
#output:3 7 4 18 1 5 3 11 2 6 4

1.5 后序遍历

#递归
def PostOrder(self, node):
    if node:
        self.PostOrder(node.left)
        self.PostOrder(node.right)
        print(node.val)
#非递归
def PostOrderLoop(self, node):
    if node == None:
        return
    stack =[]
    stack.append(node)
    pre = None
    while stack!=[]:
        node = stack[-1]
        if ((node.left==None and node.right==None) or
                (pre and (pre == node.left or pre ==node.right))):
            print(node.val)
            pre = node
            stack.pop()
        else:
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
#output:3 4 7 1 3 5 2 4 6 11 18

1.6 层序遍历

def LevelOrder(self, node):
    if node == None:
        return
    stack = []
    stack.append(node)
    while stack!=[]:
        node = stack[0]
        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)
        print(node.val)
        stack.pop(0)
output: 18 7 11 3 4 5 6 1 3 2 4

1.7 计算节点数

#递归版本
def CountNode(self, root):
    if root == None:
        return 0
    return self.CountNode(root.left) + self.CountNode(root.right) + 1
#非递归版本
def CountNodeNotRev(self, root):
    if root == None:
        return 0
    stack = []
    stack.append(root)
    index = 0
    while index<len(stack):
        if stack[index].left:
            stack.append(stack[index].left)
        if stack[index].right:
            stack.append(stack[index].right)
        index += 1
    print(len(stack))
output: 11

1.8 计算树的深度

def getTreeDepth(self, root):
    if root == None:
        return 0
    left = self.getTreeDepth(root.left) + 1
    right = self.getTreeDepth(root.right) + 1
    return left if left>right else right

1.9 计算树的叶子树

def countLeaves(self, root):
    if root == None:
        return 0
    if root.left==None and root.right==None:
        return 1
    return self.countLeaves(root.left)+self.countLeaves(root.right)

1.10 获取第K层节点数

def getKLevel(self, root, K):
    if root == None: return 0
    if K == 1: return 1
    return self.getKLevel(root.left, K-1)+self.getKLevel(root.right, K-1)

1.11 判断两颗二叉树是否相同

def StrucCmp(self, root1, root2):
    if root1 == None and root2 == None: return True
    elif root1 ==None or root2 == None: return False
    return self.StrucCmp(root1.left, root2.left) and self.StrucCmp(root1.right, root2.right)

1.12 二叉树的镜像

def Mirror(self, root):
    if root == None: return
    tmp = root.left
    root.left = root.right
    root.right = tmp
    self.Mirror(root.left)
    self.Mirror(root.right)

1.13 找最低公共祖先节点

def findLCA(self, root, node1, node2):
    if root == None: return
    if root == node1 or root == node2: return root
    left = self.findLCA(root.left, node1, node2)
    right = self.findLCA(root.right, node1, node2)
    if left and right:
        return root
    return left if left else right

1.14 获取两个节点的距离

def getDist(self, root, node1, node2):
    lca = self.findLCA(root, node1, node2) #找最低公共祖宗节点
    level1 = self.FindLevel(lca, node1) #祖节点到两个节点的距离
    level2 = self.FindLevel(lca, node2)
    return level1+level2
def FindLevel(self, node, target):
    if node == None: return -1
    if node == target: return 0
    level = self.FindLevel(node.left, target)
    if level == -1: level = self.FindLevel(node.right, target)
    if level != -1: return level + 1
    return -1

1.15 找一个节点的所有祖宗节点

def findAllAncestor(self, root, target):
    if root == None: return False
    if root == target: return True
    if self.findAllAncestor(root.left, target) or self.findAllAncestor(root.right, target):
        print(root.val)
        return True
    return False
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-09 17:39:16  更:2021-07-09 17:39:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 15:06:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码