【代码随想录】【二叉树】补day15:二叉树层序遍历,翻转二叉树、对称二叉树

文章详细介绍了二叉树的层序遍历算法,包括从根节点出发逐层遍历的实现,以及二叉树的右视图、层平均值、每行最大值、节点next指针设置、最大深度和最小深度计算。此外,还包括了N叉树的插入和层序遍历,以及二叉树的翻转和对称性判断方法。
摘要由CSDN通过智能技术生成

层序遍历以及衍生

def levelorderTravelsal(self, root: TreeNode) -> List[List[int]]: #
    if root is not None:
        que=deque()
        result=[]
        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            size=len(que)
            vec=[]
            while size:
                root=que.popleft()
                vec.append(root.val)
                size-=1
                if root.left:que.append(root.left)
                if root.right:que.append(root.right)


            result.append(vec)

    return result
    # 自底向上遍历  return result [::-1]

# 二叉树的右视图
def rightTravelsal(self,root:TreeNode):
    if root is not None:
        que=deque()
        result=[]
        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            size=len(que)
            vec=[]
            while size:
                root=que.popleft()
                vec.append(root.val)
                size-=1
                if root.right:que.append(root.right)

            result.append(vec)
    return result

# 二叉树的层平均值
def averageTravelsal(self,root:TreeNode):
    if root is not None:
        que=deque()
        result=[]
        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            size=len(que)
            vec=[]
            while size:
                root=que.popleft()
                vec.append(root.val)
                size-=1
                if root.left:que.append(root.left)
                if root.right:que.append(root.right)
            result.append(sum(vec)/len(vec))
    return result
   

# 在每行树中找最大值
def maxTravelsal(self,root:TreeNode):
    if root is not None:
        que=deque()
        result=[]
        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            size=len(que)
            vec=[]
            while size:
                root=que.popleft()
                vec.append(root.val)
                size-=1
                if root.left:que.append(root.left)
                if root.right:que.append(root.right)
            result.append(max(vec))
    return result

# 让每个节点的next指向右侧节点
def rightnext(self,root:TreeNode):
    if root is not None:
        que=deque()

        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            temp=None
            size=len(que)
            while size:
                root=que.popleft()
                if temp:
                    temp.next=root
                temp=root
                size-=1
                if root.left:que.append(root.left)
                if root.right:que.append(root.right)


def maxdepth(self,root:TreeNode):
    if root is None:return[]
    depth=0
    que=deque()
    que.append(root)
    while len(que)>0:
        depth+=1
        size=len(que)
        while size:
            root=que.popleft()
            size-=1
            if root.left:que.append(root.left)
            if root.right:que.append(root.right)
    return depth

def mindepth(self,root:TreeNode):
    if root is None:return[]
    depth=0
    que=deque()
    que.append(root)
    while len(que)>0:
        depth+=1
        size=len(que)
        while size:
            root=que.popleft()
            size-=1
            if root.left:que.append(root.left)
            if root.right:que.append(root.right)
            elif not root.left and not root.right:
                return depth

    return depth

N叉树的层序遍历

首先创建个N叉树

 def insertN(self,data,i,N):
    if self.val :
        if i < len(data):
            while i<=N:
                self.children.append(TreeNode(data[i]))
                i+=1
            for child in self.children:
                child.insertN(data,i,N)
        else:
            self.children=None
def NlevelorderTravelsal(self,root:TreeNode):
    if root is not None:
        que=deque()
        result=[]
        que.append(root)
        while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
            size=len(que)
            vec=[]
            while size:
                root=que.popleft()
                vec.append(root.val)
                size-=1
                if root.children:
                    for child in root.children:
                        que.append(child)
        result.append(vec)
        return result

翻转二叉树(层次遍历的方法)

 def reverseTree(self,root:TreeNode):# 镜像
        # 利用队列,在层序遍历时,获取左右节点之后直接做交换
        if root is not None:
            que=deque()
            que.append(root)
            while len(que)>0: # 不为空 直接pop,但是要记录pop几个元素
                size=len(que)
                while size:
                    root=que.popleft()
                    root.left,root.right=root.right,root.left
                    size-=1
                    if root.left:que.append(root.left)
                    if root.right:que.append(root.right)

        return root

对称二叉树

class solution:
    def symmetricTree(self,left:TreeNode,right:TreeNode)->bool:
        # 先考虑节点有空的情况
        if left is None and right is  None:
            return  True
        elif left is None and right is not None:
            return False
        elif right is None and left is not None:
            return False
        # 再考虑节点值不相等的情况
        elif left.val != right.val:
            return False
        # 最后
        # 确定单层递归的逻辑
        # 此时才进入单层递归的逻辑,单层递归的逻辑就是处理
        # 左右节点都不为空,且数值相同的情况。
        # 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
        # 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
        # 如果左右都对称就返回true ,有一侧不对称就返回false 。
        else:
            if self.symmetricTree(left.left,right.right) and self.symmetricTree(left.right,right.left):
                return True

            else:return False
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值