左孩子右兄弟法
吐槽:找了很久都没有找到oj,。。。。老师出的题可真是好。。。😭😭😭
1. 创建树
题目描述
假设以二元组(F,C)的形式输入一棵树的诸边(其中F表示双亲结点的标识,C表示孩子结点标识),且在输入的二元组序列C中,C是按层次顺序出现的。F='^'时C为根结点标识,若C也为‘^’,则表示输入结束。例如,如下所示树的输入序列为::
^a ab ac ad ce cf eg eh ei ej ^^
思路很简单:
- 创建哈希表,实现字符到节点的映射
- 每次为输入的第二个字符new1个节点,使用哈希表找到第1个字符对于的节点
- 如果节点有长子,就一直找右兄弟,直到
nullptr - 没有长子,则直接连接输入的两个字符
- 如果节点有长子,就一直找右兄弟,直到
代码如下:
while(cin >> a >> b,a != '^' || b != '^')
{
TreeNode *p = new TreeNode(b);
map_[b] = p;
if(a == '^') root = p;
else
{
auto q = map_[a];// q是爸爸
if(!q -> left) q -> left = p;// p是儿子
else
{
q = q -> left;
while(q -> right) q = q -> right;
q -> right = p;
}
}
}
2. 获取树第i层的所有节点
这里有点过于简单了,我就直接贴出dfs,bfs的两个代码⬇️⬇️
dfs解法
// 用dfs搜第n层所有的节点
void dfs(TreeNode* root,int tag)
{
if(!root) return;
if(tag==n) cout << root -> val << " ";
dfs(root -> left,tag + 1);
dfs(root -> right,tag);
}
bfs解法
void bfs(TreeNode *root)
{
queue<TreeNode*> q;
q.push(root);
int tag = 0;
while(q.size())
{
tag ++;
int k = q.size();
while(k --)
{
auto u = q.front();q.pop();
if(tag == n) cout << u -> val << " ";
auto p = u -> left;// u的长子
while(p) q.push(p),p = p -> right;
}
}
}

$\color{Purple}{如题}$
浙公网安备 33010602011771号