中序遍历二叉树
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
递归:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> vec; LDR(root,vec); return vec; } void LDR(TreeNode* root, vector<int> &vec){ if(root == NULL){ return; } LDR(root->left, vec); vec.emplace_back(root->val); LDR(root->right, vec); } };
迭代:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> vec; stack<TreeNode*> stk; TreeNode *node = root; while(node != NULL || !stk.empty()){ while(node != NULL){ stk.push(node); node = node->left; } node = stk.top(); stk.pop(); vec.emplace_back(node->val); node = node->right; } return vec; } };
解题思路:
1.如果当前结点存在左孩子,则将当前结点压栈,并且将左孩子设为当前结点。
2.当,当前结点为空时,表示已经没有更左的结点了,而此时栈顶元素一定是最左的,所以此时pop栈顶元素并输出。
3.虽然当前pop的结点是最左的,但不知道该结点是最左的叶子结点还是最左的中间结点。
如果是最左的叶子结点,那么右孩子就等于空,此时重新开始循环就不会执行第1步,而是从第2步开始,那么在第2步pop出的栈顶元素就是中间结点了;
如果是中间结点,那右孩子就不等于空,此时重新开始循环,就会从第1步开始,去遍历这个右子树,找到这个右子树最左的结点。