给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
方法1:递归
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> res; vector<int> inorderTraversal(TreeNode* root) { if(root){ inorderTraversal(root->left); res.emplace_back(root->val); inorderTraversal(root->right); } return res; } };
方法2:借助栈的迭代方法
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; // 存储遍历结果的容器 stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式中序遍历 // 当前节点非空 或者 栈不为空时继续循环 while (!stk.empty() || root) { // 尽可能地遍历到最左边的节点,同时将沿途的所有节点压入栈中 while (root != nullptr) { stk.push(root); root = root->left; } // 此时root为nullptr,表示已经到达最左端 // 弹出栈顶元素(即当前子树的根节点),并访问它 root = stk.top(); res.emplace_back(root->val); // 将访问的节点值添加到结果列表中 // 移动到右子树,开始处理右子树中的节点 root = root->right; stk.pop(); // 弹出已访问的节点 } return res; // 返回最终的遍历结果 } };
拓展:
二叉树的前序遍历(借助栈的迭代方法)
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; // 存储遍历结果的容器 stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历 // 当前节点非空 或者 栈不为空时继续循环 while (!stk.empty() || root) { while (root != nullptr) { //前序遍历根节点直接存放 res.emplace_back(root->val); stk.push(root); root = root->left; } // 此时root为nullptr,表示已经到达最左端 // 从栈顶节点的右节点开始处理右子树中的节点 root = stk.top()->right; stk.pop(); } return res; // 返回最终的遍历结果 } };
二叉树的后序遍历(借助栈的迭代方法)
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> res; // 存储遍历结果的容器 stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历 // 当前节点非空 或者 栈不为空时继续循环 while (!stk.empty() || root) { while (root != nullptr) { //前序遍历根节点直接存放 res.emplace_back(root->val); stk.push(root); root = root->left; } // 此时root为nullptr,表示已经到达最左端 // 从栈顶节点的右节点开始处理右子树中的节点 root = stk.top()->right; stk.pop(); } reverse(res.begin(),res.end()); // 取反即为后序遍历结果 return res; } };
标签:遍历,TreeNode,中序,right,二叉树,root,节点,left From: https://www.cnblogs.com/yueshengd/p/18624837