由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 我今年的第一次面试,恶心坏了
相关主题
问tree的iterative traversalMS面试题
Print all the paths from root to every leaf 的 iterativeG家onsite面经
狗狗家onsite面经Amazon Onsite 面经
G的一道考题BST 节点的下一个数
讨论Amazon的一道题:根节点到叶节点之间最小和,并打印路径电面没做出题。郁闷!!
如何判断两个BST的元素是一样的?热腾腾的 LinkedIn 电面题攒RP
Amazon onsite真的只要暴力解就行了么leetcode valid bst new test cases 过不去了。。。
请教一个面试题渣渣cs本科半应届如何找工作
相关话题的讨论汇总
话题: iter话题: treenode话题: nullptr话题: parent话题: backleft
进入JobHunting版参与讨论
1 (共1页)
l***c
发帖数: 55
1
国内的M家
题目是二叉树后续遍历,不用递归和栈,只有个parent指针。
我一直想问他他能写出来不
g****o
发帖数: 547
2
Morris traversal?
这题靠背
u*****o
发帖数: 1224
3
morris不用parent pointer吧
a********m
发帖数: 15480
4
为啥恶心?

【在 l***c 的大作中提到】
: 国内的M家
: 题目是二叉树后续遍历,不用递归和栈,只有个parent指针。
: 我一直想问他他能写出来不

k*******2
发帖数: 84
5
不是morris 给了parent指针
不过如果什么提示都不给 直接甩这道题确实还是有一定难度的 我今天也面这道提了
不过面试官给了提示
g****o
发帖数: 547
6
啥提示?
看来要把给parent指针的三种遍历练习一遍

【在 k*******2 的大作中提到】
: 不是morris 给了parent指针
: 不过如果什么提示都不给 直接甩这道题确实还是有一定难度的 我今天也面这道提了
: 不过面试官给了提示

l***c
发帖数: 55
7
我当时思路不清晰
面试完了细细想想,主要有几点:
1.找到最左边的叶子节点(rightChild == NULL), visit
2.回溯到上一个节点,如果它有右孩子,则进到右子树
如果没有,visit该节点,再回溯,直到有右子数
3. 重复到1
但如何区别从左子节点向上回溯和右子节点向上回溯?
可以currentNode->parent->rightChild == currentNode判断就
如果从右子节点回溯,则visit这个parent,否则进入右子数
当时这里没想通。
恶心的地方还在于写代码:
if判断,还要判断是否回溯到root ,还有几种特殊情况要处理,比如该节点没有左孩
子,只有右子数,或者没有右子树,只有一串只有左孩子的孩子们。。
第一次面试比较紧张,脑袋就是打转的。
l***c
发帖数: 55
8
大牛们可以试试写写代码
我下来后,思路稍微清晰,写起来还是很想骂
f*******w
发帖数: 1243
9
这个确实恶心
s***e
发帖数: 403
10
没有什么太大的难度啊
设置两个变量,back_left, back_right,然后先向左移动。在向parent移动的时候识
别是从左边子树移动来的还是从右边子树移动来的。如果是从右边子树移动来的说明所
有右边子树已经访问过,所以就向上移动,否则访问右边子树。最后从右边移动到root
的时候表明访问完毕。需要考察的也就是根节点的右子树是否访问完全。
下面是代码,可能有bug,不过思路大致如此。
struct TreeNode
{
TreeNode* parent;
TreeNode* left;
TreeNode* right;
int value;
explicit TreeNode(int val, TreeNode* p=nullptr) :
parent(p), left(nullptr), right(nullptr), value(val)
{}
};
void traverse(TreeNode* node)
{
TreeNode* iter=node;
bool backleft=false;
bool backright=false;
auto backtrace=[&]() {
if (iter->parent->left==iter)
backleft=true, backright=false;
else
backright=true, backleft=false;
iter=iter->parent;
};
while(iter!=nullptr)
{
if (backleft)
// backtraced, current node and all left nodes are visited
if (iter->right!=nullptr)
iter=iter->right, backleft=false;
else
if (iter->parent==nullptr)
// completed, no right branch
break;
else
backtrace();
else if (backright)
if (iter==node) // move back from the right side of tree
break;
else
backtrace();
else
{
// visit the current node
cout<<"Visited: "<value< backleft=false;
backright=false;
if (iter->left!=nullptr)
iter=iter->left;
else if (iter->right!=nullptr)
iter=iter->right;
else
// leaf, forced to back
backtrace();
}
}
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
渣渣cs本科半应届如何找工作讨论Amazon的一道题:根节点到叶节点之间最小和,并打印路径
今天面试惨败,分享面经如何判断两个BST的元素是一样的?
c语言实现TreeFeeAmazon onsite真的只要暴力解就行了么
G家实习电面总结请教一个面试题
问tree的iterative traversalMS面试题
Print all the paths from root to every leaf 的 iterativeG家onsite面经
狗狗家onsite面经Amazon Onsite 面经
G的一道考题BST 节点的下一个数
相关话题的讨论汇总
话题: iter话题: treenode话题: nullptr话题: parent话题: backleft