首页 > 其他分享 >Binary Tree Inorder Traversal

Binary Tree Inorder Traversal

时间:2023-09-02 14:33:21浏览次数:34  
标签:Binary right TreeNode val root Tree result curr Inorder

Source

Given a binary tree, return the inorder traversal of its nodes' values.

Example
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,3,2].

Challenge
Can you do it without recursion?

Note: Recursive solution is trivial, could you do it iteratively?

 

题解1 - 递归版

中序遍历的访问顺序为『先左再根后右』,递归版最好理解,递归调用时注意返回值和递归左右子树的顺序即可。

C++

/**
 * 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> result;
        helper(root, result);
        return result;
    }

private:
    void helper(TreeNode *root, vector<int> &ret) {
        if (root != NULL) {
            helper(root->left, ret);
            ret.push_back(root->val);
            helper(root->right, ret);
        }
    }
};

Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        helper(root, result);
        return result;
    }

    private void helper(TreeNode root, List<Integer> ret) {
        if (root != null) {
            helper(root.left, ret);
            ret.add(root.val);
            helper(root.right, ret);
        }
    }
}

源码分析

Java 中 helper 的输入参数中 ret 不能和 inorderTraversal 中的 result 一样。

复杂度分析

树中每个节点都需要被访问常数次,时间复杂度近似为 O(n). 未使用额外辅助空间。  

题解2 - 迭代版

使用辅助栈改写递归程序,中序遍历没有前序遍历好写,其中之一就在于入栈出栈的顺序和限制规则。我们采用「左根右」的访问顺序可知主要由如下四步构成。

  1. 首先需要一直对左子树迭代并将非空节点入栈
  2. 节点指针为空后不再入栈
  3. 当前节点为空时进行出栈操作,并访问栈顶节点
  4. 将当前指针p用其右子节点替代

步骤2,3,4对应「左根右」的遍历结构,只是此时的步骤2取的左值为空。

C++

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Inorder in vector which contains node values.
     */
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> result;
        stack<TreeNode *> s;

        while (!s.empty() || NULL != root) {
            if (root != NULL) {
                s.push(root);
                root = root->left;
            } else {
                root = s.top();
                s.pop();
                result.push_back(root->val);
                root = root->right;
            }
        }

        return result;
    }
};

Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>();

        TreeNode curr = root;
        while (curr != null || !stack.isEmpty()) {
            if (curr != null) {
                stack.push(curr);
                curr = curr.left;
            } else {
                curr = stack.pop();
                result.add(curr.val);
                curr = curr.right;
            }
        }

        return result;
    }
}

源码分析

使用栈的思想模拟递归,注意迭代的演进和边界条件即可。Java 中新建变量 curr 而不是复用 root 观察下来有一点性能提升。

复杂度分析

最坏情况下栈保存所有节点,空间复杂度 O(n), 时间复杂度 O(n).      

标签:Binary,right,TreeNode,val,root,Tree,result,curr,Inorder
From: https://www.cnblogs.com/lyc94620/p/17673649.html

相关文章

  • VUE中的 TreeSelect使用
    vue-treeselect的组件使用 一先通过npm安装vue-treeselectnpmintall--save@riophae/vue-treeselect  二页面中引入,声明组件 三页面使用 然后动态绑定data(数据) 这个Id和Label还有children都是可以修改的但是注意!一定要和后端定义的值对的上!最终效果......
  • 洛谷P5865 [SEERC2018] Tree
    P5865[SEERC2018]Tree题目传送门分析本题不难,只要枚举即可。假设两点之间的距离为树的端点,然后再去枚举其他点,符合的加入集合。若黑色点的个数超出了定义个数,那么就更新一遍。最后求最小值。ACCode:#include<bits/stdc++.h>//保命万能头usingnamespacestd;//命名空......
  • webpack生产环境优化:tree shaking
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:treeshakingtreeshaking:去除无用代码前提:1.必须使用ES6模块化2.开启production环境1一、核心配置```js/*webpack.config.jswebpack的配置文件......
  • 2023牛客暑期多校练营6 A-Tree 树上背包+并查集
    2023牛客暑期多校练营6A-Tree树上背包+并查集题目链接题意:给出一棵树,节点为黑色或者白色,定义整棵树的贡献为,任意白点到任意黑点所经过路径上的最大边权之和,节点i原本颜色已给出,可以花费c[i]代价翻转节点i的颜色,问最大贡献是多少。做法:首先我们思考怎么处理最大边权的问题......
  • 监督学习算法中梯度提升决策树(Gradient Boosting Decision Trees)
    梯度提升决策树(GradientBoostingDecisionTrees,简称GBDT)是一种监督学习算法,它是以决策树为基础分类器的集成学习方法。GBDT通过迭代地训练多个弱分类器(决策树),每个弱分类器都在前一个弱分类器的残差上进行训练,从而逐步减小残差,最终将多个弱分类器组合成一个强分类器。具体而言,GB......
  • 监督学习算法中决策树(Decision Tree)
    决策树(DecisionTree)是一种常见的监督学习算法,被广泛应用于分类和回归问题中。它通过构建一棵树状结构来对输入数据进行分类或预测。决策树的构建过程基于特征的条件划分,每个内部节点代表一个特征,每个叶子节点代表一个类别或一个数值。决策树的根节点表示整个数据集,通过不断地对数......
  • POJ 1308 Is It A Tree?
    这是我做出来的第一道有含量的ACM题,应该好好总结一下!这道1308的题,其实很简单,只要抓住了树的特征,就可以解出来。我的解法的思想是这样的:树的分支数m和树的结点数n有一个关系:n==m+1,只要抓住了这个特征,问题便可迎刃而解! 源代码:#include<stdio.h>#include<cstring>inta,b,m=0,n=0,k=......
  • 【AL&MT】Decision Tree
    1Introductionusualclassindecisiontree:ID3,C4.5,CARTID3:/InformattionEntropy,基于信息熵和信息增益C4.5:/信息增益率,baseontheID3CART:/基尼系数,usingregressorclass2achieving1.1ID3decisiontreeD-trainingset,a-attribut......
  • This TensorFlow binary is optimized to use available CPU instructions in perform
    ThisTensorFlowbinaryisoptimizedtouseavailableCPUinstructionsinperformance-criticaloperations.Toenablethefollowinginstructions:AVX2FMA,inotheroperations,rebuildTensorFlowwiththeappropriatecompilerflags.   这是TensorFlow库在安......
  • CF1858D Trees and Segments
    一道考查预处理技巧的dp。观察式子\(a\timesL_0+L_1\),一个显然的想法是“定一求一”,即预处理求出对于每个\(L_1\)最大的\(L_0\),然后对于每个\(a\),枚举\(L_1\),统计最大的\(a\timesL_0+L_1\)。这样,我们将问题转化为了:已知\(L_1=len\),求出\(dp_{len}=L_{0max}\)。dp数......