二叉树的前序、中序、后序遍历

定义:

这里写图片描述
三种序得出如下的遍历结果

前序遍历:ABDHIEJCFKG

中序遍历:HDIBEJAFKCG

后序遍历:HIDJEBKFGCA

思路

以下代码,只有前序是自己写出来的,其他都是看了人家的代码写的;题目说用递归很简单,可能是我从来没有写过递归的程序,一般都是能用for绝不再想用扫描递归。看完了中序和后序的程序,然后自己憋出来前序的程序。其实发现就用一个3个节点组成的二叉树来想,不然太多层想递归会脑阔痛。前序主要就是考虑了顺序是由根往左下再往右。从上往下扫描的时候,把左支和右支分布记录下来v1、v2;再用push_back和insert依照根->左->右顺序拼接起来。三种序的返回条件都是看有没有扫描到底了,就是root是否为NULL。

前序

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
vector的insert方式:(以下为将vec1和vec2的内容合并到vec3中)

vector<string>vec1,vec2,vec3;
        //... vec1,vec2赋值
        vec3.insert(vec3.end(),vec1.begin(),vec1.end());
        vec3.insert(vec3.end(),vec2.begin(),vec2.end());
*/
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> v;
        if (root == NULL) {
            return v;
        }
        vector<int> v1,v2,v3;
        v1 = preorderTraversal(root->left);
        v2 = preorderTraversal(root->right);
        v3.push_back(root->val);
        v3.insert(v3.end(),v1.begin(),v1.end());
        v3.insert(v3.end(),v2.begin(),v2.end());

        return v3;
    }
};

中序c++

中序

左->根->右
的顺序,详细顺序可理解为最低层的子树按“左根右”顺序排列得到一个上一层的”左“,依次这样下去。
给定一个二叉树,返回它的中序 遍历。

示例:

输入: [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> resVector;
    vector<int> inorderTraversal(TreeNode* root) {
        if(root != NULL){
            inorderTraversal(root->left);
            resVector.push_back(root->val);
            inorderTraversal(root->right);
        }
    return resVector;
    }
};

后序

左->右->根

/**
 * 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> postorderTraversal(TreeNode* root) {
        vector<int> v;
        if (!root)
            return v;
        vector<int> left = postorderTraversal(root->left);
        if (!left.empty()) {
            for (auto i:left)
                v.push_back(i);
        }
        vector<int> right = postorderTraversal(root->right);
        if (!right.empty()) {
            for (auto i:right)
                v.push_back(i);
        }
        v.push_back(root->val);
        return v;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值