二叉搜索树的后续遍历序列;之字形打印二叉树

在这里插入图片描述
解题思路:

这道题第一次没有思路,有了思路之后很简单
就是,后序遍历最后一个元素就是根节点,然后重新遍历整个序列
这个序列,一旦遇到了大于跟结点的数字,那么就不可能再遇到小于根节点的数字了,一旦遇到了,就说明这个序列不是合格的二叉搜索树的后续遍历序列

class Solution {
public:
        bool VerifySquenceOfBST(vector<int> sequence) {
	    if (sequence.empty())
		    return false;
	    int root = sequence.back();
	    int size = sequence.size();
	    int i;
	    for (i = 0; i < size; ++i)
	    {
		    if (sequence[i] > root)
		    {
			    break;
		    }
	    }
	    for (i; i < size; ++i)
	    {
		    if (sequence[i] < root)
		    {
			    return false;
		    }
	    }
	    return true;
    }
};

第二题
在这里插入图片描述
解题思路:
按照之前的,将二维数组层序遍历,然后将每一层放在一个数组中,最后将一个二维数组传出来的思路是一样的,只需要最后加一步,将后拿到的二维数组,每隔一行进行逆序,就行了。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
	vector<vector<int> > Print(TreeNode* pRoot) {
		vector<vector<int>> vec1;
		if (pRoot == nullptr)
			return vec1;
		queue<TreeNode*> que;
		que.push(pRoot);
		
		int count = 1;  //用来记录本层,进入队列的个数。刚开始的时候队列中已经有了一个元素
		int size = 0;  //用来记录下一层元素的个数
		while (!que.empty())  //当队列不为空就一直循环
		{
			vector<int> vec2;    //最后要插入二维数组的一维数组
			while (count)  //当
			{
				TreeNode* p = que.front();
				if (p->left)
				{
					que.push(p->left);
					size++;  //每进入一个元素+1,记录的是本层元素个数
				}
				if (p->right)
				{
					que.push(p->right);
					size++;
				}
				que.pop();
				vec2.push_back(p->val);
				count--;  //每出一个元素,上一层进入的元素就减减,等到了0,就说明,上一层进入元素都出去了
			}
			count = size;  //让本层个数在下次循环中,变成上一层。数据交换
			size = 0;
			vec1.push_back(vec2);
		}
		for (int i = 1; i < vec1.size(); i += 2)   //每隔一样进行逆序的代码
		{
			reverse(vec1[i].begin(), vec1[i].end());
		}
		return vec1;
	}

};

比较重要的就是,双层while循环
外层循环结束条件是,队列为空
内层循环结束条件是,上一次循环进入栈的元素,都遍历完(遍历完就意味着,将他的左右子树已经保存在来队列中,而自己也已经被压入一维数组)

发布了230 篇原创文章 · 获赞 28 · 访问量 9298

猜你喜欢

转载自blog.csdn.net/weixin_43767691/article/details/103863905
今日推荐