代码训练营 Day13 | 递归遍历 | 层序遍历

144. 二叉树的前序遍历

  1. 递归思路:
    1. 确定递归函数的参数和返回值

    2. 确定递归函数的终止条件

    3. 确定单层递归的逻辑

  2. 前序遍历顺序: 中左右

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        res = []
        
        def traversal(node):
            # when current pointer reach None, it menas end
            if node == None:
                return 
        

            # iterate order: middle;left;right
            res.append(node.val) # middle
            traversal(node.left) # left
            traversal(node.right) # right
        
        traversal(root)

        return res

145. 二叉树后序遍历

  1. 后续遍历的顺序: 左右中
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # create an array store value
        res = []

        def dfs(node):
            # if node met none, return
            if node == None:
                return 

            
            # postorder traversal order: left right middle
            dfs(node.left)  # left
            dfs(node.right) # right
            res.append(node.val) # middle
        
        dfs(root)

        return res

94. 二叉树中序遍历

  1. 中序遍历的顺序: 左中右
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # create an array
        res = []

        def dfs(node):
            # if reach to the end, return None
            if node == None:
                return
            
            # Inorder Traversal order: left middle right
            dfs(node.left)          # left
            res.append(node.val)    # middle
            dfs(node.right)         # right
        
        dfs(root)
        return res

层序遍历

  1. 我们通过记录队列的size来得知每一层应该弹出以及应该保存的元素有几个

  2. 如果root为空;则返回空数组

  3. 遍历队列,直到队列为空为止

  4. 创建一个数组用来存储每一层元素,最后的结果应该是一个二维数组

  5. 与此同时定义一个变量size来记录每一层队列的长度

    1. 由于我们在遍历树的时候在某一层会有两层元素混进来,所以这里的size至关重要,一定是要用变量保存的,因为下一层循环由于不同节点的元素情况不同可能导致size还在变动,所以下一层while循环的条件一定使用size存储的

    2. 这里的size可以告诉我们每一层有多少个元素,以及我们应该从队列弹出几个元素

102. 二叉树层序遍历

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        # create an array to store are final answer
        result = []

        # detemine the root is empty or not
        if not root:
            # we don't have root return empty array
            return result
        
        # create a queue
        queue = collections.deque([root])

        # traversal until the queue doesn't have any element
        while queue:
            # create a array store are each level elements
            level = []
            # use size to detemine which element belong to which level
            size = len(queue)

            # start record each level element
            for _ in range(size):
                # get first element in deque and pop it
                cur = queue.popleft()
                # store cur element into are level array
                level.append(cur.val)
                # detemine the left side is empty or not
                if cur.left:
                    # it's not empty, add this element into queue
                    queue.append(cur.left)
                # check right side
                if cur.right:
                    queue.append(cur.right)
            # let result store our level array
            result.append(level)
        
        # return our final result
        return result

学习完这一题后也剩下的这些题也可以一起做:

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。其中,递归遍历是比较常见的方式,而非递归遍历则需要借助栈的数据结构实现。 下面给出二叉树的递归遍历和非递归遍历的C语言代码实现: 1. 二叉树的递归遍历 前序遍历: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); // 访问根节点 preorderTraversal(root->left); // 递归遍历左子树 preorderTraversal(root->right); // 递归遍历右子树 } ``` 中序遍历: ``` void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); // 递归遍历左子树 printf("%d ", root->val); // 访问根节点 inorderTraversal(root->right); // 递归遍历右子树 } ``` 后序遍历: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); // 递归遍历左子树 postorderTraversal(root->right); // 递归遍历右子树 printf("%d ", root->val); // 访问根节点 } ``` 2. 二叉树的非递归遍历 前序遍历: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } stack<TreeNode*> st; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); printf("%d ", node->val); // 访问节点 if (node->right != NULL) { st.push(node->right); // 右子节点先入栈,保证左子节点先出栈 } if (node->left != NULL) { st.push(node->left); } } } ``` 中序遍历: ``` void inorderTraversal(TreeNode* root) { stack<TreeNode*> st; TreeNode* node = root; while (!st.empty() || node != NULL) { if (node != NULL) { // 当前节点不为空,继续将其左子节点入栈 st.push(node); node = node->left; } else { // 当前节点为空,说明已经到达最左侧,开始出栈访问节点 node = st.top(); st.pop(); printf("%d ", node->val); // 访问节点 node = node->right; // 开始访问右子节点 } } } ``` 后序遍历: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } stack<TreeNode*> st1, st2; st1.push(root); while (!st1.empty()) { TreeNode* node = st1.top(); st1.pop(); st2.push(node); // 先将当前节点入栈st2 if (node->left != NULL) { st1.push(node->left); // 左子节点入栈st1 } if (node->right != NULL) { st1.push(node->right); // 右子节点入栈st1 } } while (!st2.empty()) { // 出栈访问节点 TreeNode* node = st2.top(); st2.pop(); printf("%d ", node->val); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值