NC161 题解 | #二叉树的中序遍历#

题意分析

  • 给你一棵二叉树,需要你给出这棵二叉树的中序遍历的序列。

思路分析

  • 这是一个很经典的题目,主要的考察点就是DFS递归的思想,首先,我们需要知道什么是中序遍历?中序遍历就是先遍历二叉树的左子树,然后遍历二叉树的根节点,然后遍历二叉树的右子树。对于左右子树,同样执行这样的操作即可。最后得到的就是中序遍历的序列。

alt

  • 我们可以看到,具体的命名是根据根节点的被遍历的顺序决定的,这个方便记忆.

写法一 C++

  • 代码如下
    • 所有的节点都需要被遍历一遍,时间复杂度为O(n)
    • 每次递归都需要开辟栈空间,递归的次数为树的高度,所以空间复杂度为O(logn)
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    // 中序遍历,左子树->根节点->右子树
    void dfs(vector<int> &ans,TreeNode* root){
        // 先遍历左子树
        if(root->left){
            dfs(ans,root->left);
        }
        // 然后遍历当前根节点
        if(root==NULL){
            return;
        }else{
            ans.push_back(root->val);
        }
        // 然后遍历右子树
        if(root->right){
            dfs(ans,root->right);
        }
    }
    vector<int> inorderTraversal(TreeNode* root) {
        // write code here
        vector<int> ans;
        if(root==NULL){
            return ans;
        }
        dfs(ans,root);
        return ans;
    }
};

写法二 GO

  • 代码如下
    • 所有的节点都需要被遍历一遍,时间复杂度为O(n)
    • 每次递归都需要开辟栈空间,递归的次数为树的高度,所以空间复杂度为O(logn)
package main
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型一维数组
*/
func dfs(ans *[]int,root *TreeNode){
    // 如果当前的结点指针为空
    if(root==nil){
        return
    }
    // 递归左子树
    dfs(ans,root.Left)
    *ans=append(*ans,root.Val)
    // 递归右子树
    dfs(ans,root.Right)
}
func inorderTraversal( root *TreeNode ) []int {
    // write code here
    var ans []int
    if(root==nil){
        return ans;
    }
    dfs(&ans,root)
    return ans;
}