力扣#94 树的中序遍历

对树的分支情况进行简单列举如图1所示,图中圆形表示树的节点,实线连接每个节点,虚线表示后期将要添加的“连接”以便节点顺序进行中序遍历,节点旁边的数字表示中序遍历的遍历顺序。

 

图1 树的分支情况

通过图1观察到两个结论:

  1. 右节点只需要按顺序遍历

  2. 有左节点就一定需要一条“回溯”的链接

假设存在x,有x->left表示x的左节点,x->right表示x的右节点,x->val表示x的值

图2 流程

图3 结果

C++代码如下:

 /**
  * 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;
         while (root != nullptr) {
             if (root->left == nullptr) {
                 res.push_back(root->val);
                 root = root->right;
            } else {
                 TreeNode *tmp = root->left;
                 while (tmp->right != nullptr) {
                     tmp = tmp->right;
                }
                 tmp->right = root;
                 root = root->left;
                 tmp->right->left = nullptr;
            }
        }
         return res;
    }
 };


posted @ 2024-03-16 00:25  SkySource  阅读(5)  评论(0编辑  收藏  举报