力扣-94. 二叉树的中序遍历-CPP

0.背景

  本来要讲其他题目,但是不讲了这个,中序遍历也是个事儿。先讲这个简单题。

1.中序遍历

  我们在学习二叉树时,都学习过中序遍历,这里的序,其实不便于理解。书本规范叫“中根遍历”多好?不言而喻了,是不是?直接就知道遍历左、根、右

  好,我们现在开始按照递归程序进行分析。

  二叉树的结构如下:

struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode() : val(0), left(NULL), right(NULL) {}
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
	TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

  我们可以发现,这个结构是有左右子树的指针的,也就是,是有递推关系的哦。我们假设有一个无穷深的满二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。 也就是说,如果一个二叉树的层数为 k k k ,且结点总数是 2 k − 1 2^{k} -1 2k−1 ,则它就是满二叉树。

node->left
node->right
node->left->right->...->left

  在数据结构中,我们提到节点结点,都是指一种东西。

  所以,递推关系知道,临界条件无非就是遍历当前的这个根节点

  这个思路很重要,我们很多二叉树的问题,都要把问题试图推导到只剩下一个根节点,然后对根节点进行操作。

  有了以上的思路,易得:

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

2.扩展阅读

  官方题解中,是这样写代码的:

class Solution {
public:
    void inorder(TreeNode* root, vector<int>& res) {
        if (!root) {
            return;
        }
        inorder(root->left, res);
        res.push_back(root->val);
        inorder(root->right, res);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        inorder(root, res);
        return res;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  虽然使用了c++的新特性,但是从结构上也能看出不同,它是先判断了空。

  这种风格,被称为卫式语句(卫语句)

卫(guard)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guard codeguard clause)用于检查先决条件。

  它的核心思想是避免if-else深层嵌套,怎么样?你学会了吗?欢迎托梦给我,或者在评论区和其他读者一起讨论。

上一篇:k8s-1.14.2安装文档


下一篇:二叉树的最大深度