面完快手,一道问题求指教

我跪的那道算法题,我跪不瞑目
剑指offer里的:按之字形顺序打印二叉树

因为原来没刷过这道题,经过思考后,觉得用一个队列和一个栈可以完成

虽然我的答案不对,但是面试官说可以用一个队列就能完成,用空指针判断每行是不是结束。。。。

我到现在还是不明白面试官的想法。。。。。大佬们请指教
全部评论
写了一个程序,求大神看看 # -*- coding: UTF-8 -*-. class Node(object):     """节点类"""     def __init__(self, data = -1, lchild = None, rchild = None, isEmpty = 0):         self.data = data         self.lchild = lchild         self.rchild = rchild         self.isEmpty = isEmpty class BinaryTree(object):     """树类"""     def __init__(self):         self.root = Node(isEmpty = 1)     def add(self, data):         """为树增加节点,建立二叉查找树"""         node = Node(data)         if self.root.isEmpty == 1:             self.root = node         else:             treeNode = self.root             while(1):                 if node.data <= treeNode.data:                     if treeNode.lchild == None:                         treeNode.lchild = node                         break                     else:                         treeNode = treeNode.lchild                 else:                     if treeNode.rchild == None:                         treeNode.rchild = node                         break                     else:                         treeNode = treeNode.rchild     def printTree(self):         """按之字形顺序打印二叉树"""         if self.root == None:             return         myList = []         myList.append(self.root)         flagForward = 0# 为0表示下一行逆序打印,为1表示下一行正序打印         numberNow = 1         numberNext = 0         while(1):             # 表示在该行查找             if numberNow:                 # 总是将先放入的先打印出来                 node = myList.pop(0)                 numberNow -= 1                 print node.data,                 # 根据flagForward的值改变左右子树的打印数学                 if flagForward:                     if node.rchild:                         myList.insert(numberNow, node.rchild)                         numberNext += 1                     if node.lchild:                         myList.insert(numberNow, node.lchild)                         numberNext += 1                 else:                     if node.lchild:                         myList.insert(numberNow, node.lchild)                         numberNext += 1                     if node.rchild:                         myList.insert(numberNow, node.rchild)                         numberNext += 1             # 表示该行结束了             else:                 # 下一行变成该行                 if numberNext:                     numberNow = numberNext                     numberNext = 0                     # 正方向逆序                     flagForward = ~flagForward                 # 表示树结束了                 else:                     break def test():     'Test the program.'     arr = [5, 6, 1, 4, 2, 69, -1, 24]     tree = BinaryTree()     for item in arr:         tree.add(item)     #         5     #     1       6     # -1    5      69     #      2      24     print '按之字形顺序打印二叉树:'     tree.printTree() if __name__ == "__main__":     test()
点赞 回复 分享
发布于 2017-10-29 21:09
肯定是你没有     吃灯泡,吃辣椒那种绝技,
点赞 回复 分享
发布于 2017-09-25 18:12
是不是要会双击666
点赞 回复 分享
发布于 2017-09-25 18:08
public static void snakePrint(BinaryTreeNode root) {         if(root == null) {             return;         }         ArrayDeque<BinaryTreeNode> arrayDeque = new ArrayDeque();         arrayDeque.add(root);         boolean flag = true;         while(!arrayDeque.isEmpty()) {             int size = arrayDeque.size();             if(flag) {                 for(int i=0;i<size;i++) {                     System.out.print(arrayDeque.peekFirst().value+" ");                     BinaryTreeNode tmp = arrayDeque.pollFirst();                     if(tmp.left != null) {                         arrayDeque.addLast(tmp.left);                     }                     if(tmp.right != null) {                         arrayDeque.addLast(tmp.right);                     }                 }                 flag = flag ? false : true;             } else {                 for(int i=0;i<size;i++) {                     System.out.print(arrayDeque.peekLast().value+" ");                     BinaryTreeNode tmp = arrayDeque.pollLast();                     if(tmp.left != null) {                         arrayDeque.addLast(tmp.left);                     }                     if(tmp.right != null) {                         arrayDeque.addLast(tmp.right);                     }                 }                 flag = flag ? false : true;             }         }     }
点赞 回复 分享
发布于 2018-06-03 15:05
用一个双端队列,即可解决,设一个标记位,记录上一层的遍历顺序,下一层遍历的时候相反方向遍历即可,同时修改标记位。
点赞 回复 分享
发布于 2018-06-03 15:04
#include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cstring> #include<cassert> #include<climits> #include<iostream> #include<sstream> #include<vector> #include<set> #include<map> #include<stack> #include<queue> #include<bitset> #include<algorithm> #include<iterator> #include<string> #include<tuple> #include<random> #include <chrono> using namespace std; struct TreeNode {     int val;     TreeNode* left;     TreeNode* right;     TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void zigzag(TreeNode* root) {     vector<TreeNode*> pts;     if (NULL == root)         return;     queue<TreeNode*> q;     q.push(root);     int num1 = 1, num2 = 0;     TreeNode* cur = NULL;     while (!q.empty()) {         cur = q.front();         q.pop();         if (cur->left != NULL) {             q.push(cur->left);             num2++;         }         if (cur->right != NULL) {             q.push(cur->right);             num2++;         }         pts.push_back(cur);         num1--;         if (0 == num1) {             pts.push_back(NULL);             num1 = num2;             num2 = 0;         }     }     int n = pts.size();     int rev = 0;     int i, j;     i = -1;     int mid, sum;     while (i < n) {         j = i + 1;         while (j < n && pts[j] != NULL)             j++;         // reverse         if (rev) {             mid = i + (j - i) / 2;             sum = i + j;             for (int x=i+1; x<=mid; x++)                 swap(pts[x], pts[sum-x]);         }         rev = !rev;         i = j;     }     for (i=0; i<n; i++)         if (pts[i] != NULL)             printf(" %d ", pts[i]->val); } int main() {     TreeNode* root = new TreeNode(1);     root->left = new TreeNode(2);     root->right = new TreeNode(3);     root->left->left = new TreeNode(4);     root->right->left = new TreeNode(5);     root->right->right = new TreeNode(6);     zigzag(root);     return 0; } 用普通的队列加标记即可实现。
点赞 回复 分享
发布于 2018-05-08 22:43
楼主来一发面经~
点赞 回复 分享
发布于 2018-05-03 21:54
用doubly linked list实现队列,一个变量存当前层traverse方向,根据方向判断存取node的方向和顺序。。。
点赞 回复 分享
发布于 2018-02-17 12:05
关键一个队列不知道什么时候换向折返
点赞 回复 分享
发布于 2017-10-29 20:05
之字形一个队列完成?你倒是叫面试官说说怎么做啊。反正,我是不知道一个队列要怎么打之字形。
点赞 回复 分享
发布于 2017-10-29 18:31
意思是上一层和下一层的数要分开,可以用两个变量numPrevious,numNext分别记录上一层和下一层在序列中的个数,numPrevious减1的时候numNext要加上对应的子数的个数,当numPrevious为0的时候表示该行结束了,如果numNext不为0就把numNext赋给numPrevious,如果为0就表示树结束了。
点赞 回复 分享
发布于 2017-10-29 18:05
队列可以反向迭代(java api)
点赞 回复 分享
发布于 2017-10-17 11:04
请问快手哪里投递
点赞 回复 分享
发布于 2017-09-29 09:41
你表演的啥绝活呀,兄弟?
点赞 回复 分享
发布于 2017-09-25 18:15
感觉咋样啊
点赞 回复 分享
发布于 2017-09-25 18:15
都问些啥
点赞 回复 分享
发布于 2017-09-25 17:42
面经呢???23333333333333
点赞 回复 分享
发布于 2017-09-25 17:31

相关推荐

头像
01-22 10:36
已编辑
牛客运营
活动规则:你可以使用任何AI工具,生成牛客娘表情包,发送你的生成提示词+图片至本贴评论区,并将无水印原图发送至微信群。活动奖励:1、每张&nbsp;可爱的牛客娘表情包,可获得&nbsp;10牛币奖励(每人上限100张)&nbsp;~2、点赞量最高的前xx个评论,送牛客娘马克杯,(每25个评论,赠送一个马克杯,最多赠送20个)牛客娘表情包交流群:生成示例:&nbsp;这是牛客娘的形象,帮我用牛客娘的形象画一些ACM算法竞赛相关的表情包&nbsp;需要的表情包有:&nbsp;摸头&nbsp;(安慰)&nbsp;呵呵(冷笑的呵呵)&nbsp;牛魔&nbsp;牛啤(左手比大拇指,右手拿着啤酒)&nbsp;这次一定&nbsp;比心&nbsp;不许TD&nbsp;要给他迎头痛击&nbsp;设计要求:&nbsp;1.统一使用萌系风格。&nbsp;2.表情生动和肢体动作丰富、...
Xuan2333:没错没错就是我,牛客娘表情包的创作者,大家都可以自用哒awa (第5张“按住牛客娘开始思索”出自我的世界里的机械动力模组,我做这个表情包可是花了我1个多小时的时间啊qwq) 最后附上所有用过的素材图,希望大家喜欢awa wow 将图片中的人物改成两手托腮,只显示头部照片,眼睛为星星眼,表情开心,并在下方附上文字“wow” Ciallo 将第二张图的人物做出第一张图的姿势并且要在身体各处还有五官和动作完全一致,不要改背景,高分辨率,最佳质量,并在下方加上和图片相符的文字“Ciallo!” 说不出话 生成这个任务面无表情,一脸犹豫,嘴角下垂,双手交叉在胸前,在中间加上一个带有一条斜杠的麦克风的表示闭麦的符号,并且在下面配上文字“说不出话” 按住牛客娘开始思索 将第二张图的人物进行修改,要求是有一只手按在人物的头上,人物的眼神灵动,手略有着急的轻微摆起,头部微微抬起,并将第一张图放在第二张图的下方,高品质,把这张图的下方的黑色部分加上文字“按住牛客娘开始思索”,字体与图片里展示的“牛客娘”这三个字的字体相一致 我也要WA吗 将第一张图的人物的头发,脸部和衣服改成第二张图的人物的,眼睛保持不变,脸上的汗保持不变,头发的长度修改为和图片的一致,脸上不要有红晕,眼睛里不要有高光,眼睛里只要纯灰色查看图片
点赞 评论 收藏
分享
牛至超人:您好,京东物流岗了解一下吗?负责精加工食品的端到端传输
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务