数据结构算法刷题(18)二叉树的层序遍历

对于层序遍历:

 

 

 

 

 

class Solution:

    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

        if root is None:

            return []

        ans = [] #最终的答案数组

        cur = [root] #每层的根节点

        while cur:

            value = [] #存放当前层的节点值

            nex = [] #存放当前层的子节点

            for node in cur:

                value.append(node.val)

                if node.left: #如果左孩子在,就把左孩子放入nex

                    nex.append(node.left)

                if node.right:#如果右孩子在,就把右孩子放入nex

                    nex.append(node.right)

            cur = nex #更换当前层

            ans.append(value) #该层节点值加入最终层

        return ans

 将cur和nex合并成一个队列,先进先出

class Solution:

    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

        if root is None:

            return []

        ans = [] #最终的答案数组

        q = deque([root])

        while q:

            vals = []

            for _ in range(len(q)):

                node = q.popleft()

                vals.append(node.val)

                if node.left:

                    q.append(node.left)

                if node.right:

                    q.append(node.right)

            ans.append(vals)

        return ans

class Solution:

    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

        if root is None:

            return []

        ans = []

        q = deque([root])

        even = False #是否是偶数层,奇数层不反转,偶数层反转

        while q:

            vals = []

            for _ in range(len(q)):

                node = q.popleft()

                vals.append(node.val)

                if node.left: q.append(node.left)

                if node.right:q.append(node.right)

            ans.append(vals if not even else vals[::-1]) 

            even = not even #反转

        return ans

 

解法一:层序遍历二叉树之后,返回最后一层的第一个节点

class Solution:

    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:

        ans = [] #存放层序遍历

        q = deque([root])

        while q:

            vals = []

            for _ in range(len(q)):

                node = q.popleft()

                vals.append(node.val)

                if node.left : q.append(node.left)

                if node.right: q.append(node.right)

            ans.append(vals)

        return ans[-1][0]

解法二:从右往左的层序遍历二叉树,最后一个出队的节点就是所求节点

class Solution:

    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:

        q = deque([root])

        ans = -inf

        while q:

                node = q.popleft()

                if node.right : q.append(node.right)

                if node.left: q.append(node.left)

                ans = node.val

        return ans

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现二叉树层序遍历需要用到队列这一数据结构,具体实现步骤如下: 1. 定义一个队列结构体,并实现队列的基本操作,包括入队、出队、队列是否为空等。 ``` typedef struct QueueNode { TreeNode *val; struct QueueNode *next; } QueueNode; typedef struct { QueueNode *front; QueueNode *rear; int size; } Queue; Queue *createQueue() { Queue *q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = NULL; q->size = 0; return q; } bool isEmpty(Queue *q) { return q->size == 0; } void enqueue(Queue *q, TreeNode *val) { QueueNode *newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->val = val; newNode->next = NULL; if (isEmpty(q)) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } q->size++; } TreeNode *dequeue(Queue *q) { if (isEmpty(q)) { return NULL; } QueueNode *node = q->front; TreeNode *val = node->val; q->front = q->front->next; if (q->front == NULL) { q->rear = NULL; } free(node); q->size--; return val; } ``` 2. 实现二叉树层序遍历,使用队列来存储当前层的节点,并逐层遍历。 ``` void levelOrder(TreeNode *root) { if (root == NULL) { return; } Queue *q = createQueue(); enqueue(q, root); while (!isEmpty(q)) { int levelSize = q->size; for (int i = 0; i < levelSize; i++) { TreeNode *node = dequeue(q); printf("%d ", node->val); if (node->left != NULL) { enqueue(q, node->left); } if (node->right != NULL) { enqueue(q, node->right); } } printf("\n"); } } ``` 以上代码实现了二叉树层序遍历,可以通过以下测试代码进行测试: ``` int main() { TreeNode *root = createTree(); printf("层序遍历结果:\n"); levelOrder(root); return 0; } ``` 其中,`createTree()` 是创建一个二叉树的函数,可以根据需要自行实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值