定义一个栈,用来模拟压入的顺序,压入之后再通过比较栈顶和输出序列的首元素是否相等,即这个元素是不是弹出元素,若是弹出元素,那么就弹出这个栈的栈顶元素,再删除输出序列的首元素,因为输出序列就是其出栈的顺序,所以只要和首元素不相等它就不是现在应该输出的数据,结束的条件就是将压入顺序数组遍历完,并且如果遍历完了输出序列还不为空就说明其不是该压入序列的弹出序列,反之就是 。
剑指 Offer 32 - I. 从上到下打印二叉树
/*** 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:queue myQueue;vector valueVector;vector levelOrder(TreeNode* root) {if (root == NULL) {return valueVector;}myQueue.push(root);while (myQueue.size()) {TreeNode *temp = myQueue.front();valueVector.push_back(temp->val);if (temp->left) {myQueue.push(temp->left);}if (temp->right) {myQueue.push(temp->right);}myQueue.pop();}return valueVector;}};
就是一个简单的层序遍历,使用一个队列和一个返回的,先向队列存入根节点root,然后获取的首元素,将其值存入返回的,然后再向队列存入首元素的左右孩子在队尾,在pop队列的首元素,一直这样循环,直到队列为空就表示该二叉树层序遍历完毕 。注意存入左右孩子之前要判断其是否存在 。
剑指 Offer 32 - II. 从上到下打印二叉树 II
/*** 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:queue myQueue;vector> levelOrder(TreeNode* root) {vector> valueVector;vector tempVector;if (root == NULL) {return valueVector;}TreeNode preventNode;TreeNode *preTreeNode = &preventNode;int i = 0;myQueue.push(root);myQueue.push(preTreeNode);while (myQueue.size()) {TreeNode *temp = myQueue.front();if (temp == preTreeNode) {i++;myQueue.pop();valueVector.push_back(tempVector);tempVector.clear();if (!myQueue.size()) {break;}myQueue.push(preTreeNode);continue;}tempVector.push_back(temp->val);if (temp->left) {myQueue.push(temp->left);}if (temp->right) {myQueue.push(temp->right);}myQueue.pop();}return valueVector;}};
和上边说的层序遍历很相似,只是多加了一堵墙,用来隔开每一层的所有节点,如果到这堵墙了,先pop出去然后判断队列是否为空,为空就表示遍历完了,直接break结束循环就行,不为空就表示没完,再加入这堵墙作为屏障 。的话每次遇到这堵墙之前都使用一个临时的一维,一直往其中添加数值,直到碰到这堵墙我们就将这个添加到最后返回的二维中,初始化该一维,继续使用就行了 。
剑指 Offer 32 - III. 从上到下打印二叉树 III
/*** 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> levelOrder(TreeNode* root) {vector> valueVector;vector tempVector;if (root == NULL) {return valueVector;}queue myQueue; //用于层次遍历二叉树stack myStack; //反向输出就先压入栈TreeNode preventNode;TreeNode *preTreeNode = &preventNode;int i = 1;myQueue.push(root);myQueue.push(preTreeNode);while (myQueue.size()) {TreeNode *temp = myQueue.front();if (temp == preTreeNode) {i++;//使用栈反转队列valueVector.push_back(tempVector);tempVector.clear();myQueue = queue (); //清空队列while (myStack.size()) {myQueue.push(myStack.top());myStack.pop();}if (!myQueue.size()) {break;}myQueue.push(preTreeNode);continue;}tempVector.push_back(temp->val);if (i % 2) {if (temp->left) {myQueue.push(temp->left);myStack.push(temp->left);}if (temp->right) {myQueue.push(temp->right);myStack.push(temp->right);}} else {if (temp->right) {myQueue.push(temp->right);myStack.push(temp->right);}if (temp->left) {myQueue.push(temp->left);myStack.push(temp->left);}}myQueue.pop();}return valueVector;}};