二叉树的遍历-Recursive/Iterative/Morris

本文介绍了二叉树的前序、中序、后序遍历,分别用递归、迭代和Morris方法实现。递归方法空间复杂度为O(n),迭代方法使用栈,空间复杂度为O(n/2),而Morris方法实现空间复杂度为O(1)。详细代码和解释帮助理解各种遍历方式。
摘要由CSDN通过智能技术生成

二叉树是常见的数据结构,二叉树相关的算法题目也是非常常见的。下面总结以下二叉树的前序/中序/后序遍历方法,分别用递归(O(n) Space),迭代(O(n) Space),Morris(O(1) Space)方法实现。

二叉树遍历的时间复杂度都是O(n),不同方法的区别主要是在空间复杂度上。


Recursive Traversal

递归是一种非常直观的方法,也是最容易实现的方法。递归的方法的空间复杂度为O(n)。
节点的定义如下:

// Definition for a binary tree node.
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}

Preorder Traversal

void preorderTraversal(TreeNode* root, vector<int>& nums) {
    if(!root) return;
    nums.push_back(root->val);
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

Inorder Traversal

void inorderTraversal(TreeNode* root, vector<int>& nums) {
    if(!root) return;   
    inorderTraversal(root->left, nums);
    nums.push_back(root->val);
    inorderTraversal(root->right, nums);
}   

Postorder Traversal

void postorderTraversal(TreeNode* root, vector<int>& nums) {
    if(!root) return;   
    postorderTraversal(root->left, nums);
    postorderTraversal(root->right, nums);
    nums.push_back(root->val);
}

Iterative Traversal

迭代方法需要使用stack来保存遍历路径上待遍历的节点,从根节点到叶节点,最多保存n/2个节点。空间复杂度为O(n)。

Preorder Traversal

void preorderTraversal(TreeNode* root, vector<int>& nums) {
    vector<int> nums;
    vector<int> nums;
    stack<TreeNode* > st; // pointers in stack are valid

    while (root || !st.empty()) {
        if (!root) {
            root = st.top();
            st.pop();
        }            
        nums.push_back(root->val);
        // if valid right child, push into stack 
        if (root->right) st.push(root->right);

        // go to the left child
        root = root->left;
    }       
    return nums;        
}

Inorder Trav

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值