题解 | #二叉树的中序遍历#
二叉树的中序遍历
http://www.nowcoder.com/practice/0bf071c135e64ee2a027783b80bf781d
题意整理:
既对一颗以根节点给出的树进行中序遍历。
二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历树,而在访问左子树及右子树的时候按照同样的方式遍历,遇到空节点返回,直到遍历完整棵树。
方法一:递归实现
核心思想:
按照中序遍历的意义,很容易想出递归实现,既创建递归函数dfs(root),如果root为空则返回,否则对左节点调用dfs函数,再将当前节点值加入答案数组,之后对右节点调用dfs函数
核心代码:
class Solution { public: vector<int> ans; void dfs(TreeNode* root) { if(root == nullptr) { return; } dfs(root->left); ans.push_back(root->val); dfs(root->right); } vector<int> inorderTraversal(TreeNode* root) { dfs(root); return ans; } };
复杂度分析:
时间复杂度:。其中n为二叉树节点的个数。二叉树的遍历中每个节点只会被访问一次。
空间复杂度:,空间复杂度取决于递归的栈深度,在二叉树退化为链表时达到最坏情况为
方法二:迭代实现
核心思想:
方法一的递归函数也可以用迭代实现,既将递归时的隐式栈显式地模拟出来。
核心代码:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode*> sk; while(root != nullptr || !sk.empty()) { //此时还有节点未加入 while (root != nullptr) { //一直达到最左节点,中间节点全部入栈 sk.push(root); root = root->left; } root = sk.top(); sk.pop(); //取出当前节点加入 ans.push_back(root->val); root = root->right;//处理右节点 } return ans; } };
复杂度分析:
时间复杂度:。其中n为二叉树节点的个数。二叉树的遍历中每个节点只会被访问一次。
空间复杂度:,空间复杂度取决于栈的深度,在二叉树退化为链表时达到最坏情况为