首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客1610600号
2017-10-17 12:42
已编辑
北京航空航天大学 算法工程师
关注
已关注
取消关注
面完快手,一道问题求指教
我跪的那道算法题,我跪不瞑目
剑指offer里的:
按之字形顺序打印二叉树
因为原来没刷过这道题,经过思考后,觉得用一个队列和一个栈可以完成
虽然我的答案不对,但是面试官说可以用一个队列就能完成,用空指针判断每行是不是结束。。。。
我到现在还是不明白面试官的想法。。。。。大佬们请指教
提示
全部评论
推荐
最新
楼层
牛客2845888号
北京航空航天大学 算法工程师
写了一个程序,求大神看看 # -*- 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
你们都有offer,只有我没有offer
某山村小学 Java
肯定是你没有 吃灯泡,吃辣椒那种绝技,
点赞
回复
分享
发布于 2017-09-25 18:12
zohar727
湖南科技大学 前端工程师
是不是要会双击666
点赞
回复
分享
发布于 2017-09-25 18:08
牛客269
字节跳动_字节跳动技术专家
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
牛客269
字节跳动_字节跳动技术专家
用一个双端队列,即可解决,设一个标记位,记录上一层的遍历顺序,下一层遍历的时候相反方向遍历即可,同时修改标记位。
点赞
回复
分享
发布于 2018-06-03 15:04
Jeff.D
Владимирский юридический институт 算法工程师
#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
尘归空
华中科技大学 C++
楼主来一发面经~
点赞
回复
分享
发布于 2018-05-03 21:54
牛客2306883号
用doubly linked list实现队列,一个变量存当前层traverse方向,根据方向判断存取node的方向和顺序。。。
点赞
回复
分享
发布于 2018-02-17 12:05
简单的电脑
中国石油大学(北京) Java
关键一个队列不知道什么时候换向折返
点赞
回复
分享
发布于 2017-10-29 20:05
无聊刷刷题
University of Alaska Fairbanks Java
之字形一个队列完成?你倒是叫面试官说说怎么做啊。反正,我是不知道一个队列要怎么打之字形。
点赞
回复
分享
发布于 2017-10-29 18:31
牛客2845888号
北京航空航天大学 算法工程师
意思是上一层和下一层的数要分开,可以用两个变量numPrevious,numNext分别记录上一层和下一层在序列中的个数,numPrevious减1的时候numNext要加上对应的子数的个数,当numPrevious为0的时候表示该行结束了,如果numNext不为0就把numNext赋给numPrevious,如果为0就表示树结束了。
点赞
回复
分享
发布于 2017-10-29 18:05
天行键
华中科技大学 Java
队列可以反向迭代(java api)
点赞
回复
分享
发布于 2017-10-17 11:04
嘻希
宇宙大学 前端工程师
请问快手哪里投递
点赞
回复
分享
发布于 2017-09-29 09:41
我家的狗不咬人
山东大学 运营
你表演的啥绝活呀,兄弟?
点赞
回复
分享
发布于 2017-09-25 18:15
Jungggle
重庆大学 Java
感觉咋样啊
点赞
回复
分享
发布于 2017-09-25 18:15
husama
吉林大学 Java
都问些啥
点赞
回复
分享
发布于 2017-09-25 17:42
光头小强
清华大学 Java
面经呢???23333333333333
点赞
回复
分享
发布于 2017-09-25 17:31
暂无评论,快来抢首评~
相关推荐
昨天 20:27
西安电子科技大学 算法工程师
C++备忘录模式:轻松实现状态回滚
备忘录模式的核心思想 备忘录模式(Memento Pattern)是一种行为设计模式,允许在不破坏封装性的前提下捕获并外部化对象的内部状态,以便后续可以恢复到该状态。该模式的核心在于分离状态保存与恢复的逻辑,避免直接暴露对象内部细节。 在C++中,备忘录模式通常涉及三个角色: Originator(原发器):需要保存和恢复状态的对象。 Memento(备忘录):存储Originator的内部状态。 Caretaker(管理者):负责保存和管理Memento对象。 备忘录模式的实现步骤 定义Memento类 备忘录类需要保存Originator的部分或全部状态信息,通常设计为Originat...
点赞
评论
收藏
分享
昨天 22:06
成都中医药大学 运营
动态规划解决数字排列整除问题
问题描述 题目给定一个数字字符串 $s$ 和一个正整数 $d$,要求计算 $s$ 的所有排列中能被 $d$ 整除的排列数量。数字可能包含前导零,且如果数字相同但位置不同视为不同排列。 动态规划解法 使用状态压缩动态规划(DP)来解决。定义 $dp[mask][r]$ 表示当前已选数字的掩码为 $mask$,且当前数模 $d$ 的余数为 $r$ 时的方案数。 初始化时,$dp[0][0] = 1$,表示未选任何数字时余数为 0 的方案数为 1。 状态转移时,枚举每一位未选的数字 $s[j]$,更新新的余数: $$ new_r = (r \times 10 + (s[j] - '0')) \mod...
点赞
评论
收藏
分享
11-02 23:41
内蒙古工业大学 Java
可能有人天生就是废物吧
我可能就是那个无志的飞舞吧哎
代码飞升_不回私信人...:
别这样贬低自己,降低预期,放平心态,跟昨天的自己比。做好自己,反而会效率更高心态更好,加油兄弟
点赞
评论
收藏
分享
11-16 21:01
已编辑
东莞理工学院 Java
学院本大三,还有机会吗
boss上1735个沟通,投出59份简历,一共3个面试,0offer,试着投测开,回复也很少,人都麻了,不知道自己到底适不适合这行。我的想法是直接梭哈就业,考研实在没什么信心
迷茫的大四🐶:
简历很烂,学历很差,还是建议考研深藏一下
九月了,是考研还是就业?
点赞
评论
收藏
分享
11-14 10:13
上海交通大学 嵌入式软件开发
高通嵌入式面经
看到网上高通的面经少之又少。1.linux内核空间和用户空间的通讯方式2.34、32位的linux的虚拟内存空间的分布情况?高端内存映射区是什么?他的地址是什么?3、用户态堆栈在系统调用时会发生什么变化吗?4.map怎么把物理地址返给用户空间5..伙伴系统如果说申请内存不够会怎么办 回收之后还不够会怎么办6.如果代码段改了个函数,物理地址不变,需不需要刷新cache,需要刷新哪个cache?7.驱动如何匹配的,除了compatbile匹配还有什么匹配规则,匹配优先级是什么?8.内核内存如何拷贝到用户内存9.arm v8的异常等级,?有几种模式?异常等级有几种?工作模式有哪些?10.讲些MMU,...
查看20道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
腾讯、快手、百度Q3财报新鲜出炉!
2.3W
2
...
双九无实习 CPP 拿下 SSP-秋招总结(其二)
2830
3
...
【Offer帮选】专家大佬在线接单!发帖即享免费1V1抉择指导
2791
4
...
wxg和字节flow咋选
2753
5
...
滴滴日常一面速通(附面筋,已OC)
2633
6
...
“受虐狂”再选一次还要选这份苦差事
2480
7
...
你听说了吗?百度财报发布后社招HC锁了
2282
8
...
双九无实习CPP拿下SSP-秋招总结(其一)
2170
9
...
学院本放弃秋招了
1994
10
...
作业帮一面
1914
创作者周榜
更多
正在热议
更多
#
那些年,我收到的‘奇葩’回复
#
10399次浏览
103人参与
#
小马智行求职进展汇总
#
16415次浏览
54人参与
#
腾讯音乐秋招
#
426654次浏览
4758人参与
#
OC/开奖
#
170626次浏览
1252人参与
#
秋招你经历过哪些无语的事
#
11650次浏览
141人参与
#
职场中那些令人叹为观止的八卦
#
20941次浏览
194人参与
#
百度秋招
#
47799次浏览
373人参与
#
校招薪资来揭秘
#
43956次浏览
312人参与
#
秋招吐槽大会
#
66979次浏览
592人参与
#
你找工作想离家近 or 离家远?
#
12837次浏览
207人参与
#
如果校招重来我最想改变的是
#
335596次浏览
3141人参与
#
租房前辈的忠告
#
283291次浏览
7246人参与
#
多益网络求职进展汇总
#
51110次浏览
241人参与
#
我的职场社死时刻
#
15469次浏览
137人参与
#
哪些公司开始补录了
#
15958次浏览
143人参与
#
一人推荐一个值得去的通信/硬件公司
#
223609次浏览
2054人参与
#
你秋招最后悔的选择
#
12283次浏览
90人参与
#
XX请雇我工作
#
11227次浏览
89人参与
#
秋招提前批,你开始投了吗
#
678943次浏览
8395人参与
#
满帮集团求职进展汇总
#
11713次浏览
89人参与
#
毕业租房也有小确幸
#
144786次浏览
4505人参与
#
你父母给过你哪些不靠谱的职场建议?
#
11742次浏览
165人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务