左孩子右兄弟法

吐槽:找了很久都没有找到oj,。。。。老师出的题可真是好。。。😭😭😭


1. 创建树

题目描述

假设以二元组(F,C)的形式输入一棵树的诸边(其中F表示双亲结点的标识,C表示孩子结点标识),且在输入的二元组序列C中,C是按层次顺序出现的。F='^'时C为根结点标识,若C也为‘^’,则表示输入结束。例如,如下所示树的输入序列为::

^a ab ac ad ce cf eg eh ei ej ^^

思路很简单:

  1. 创建哈希表,实现字符到节点的映射
  2. 每次为输入的第二个字符new1个节点,使用哈希表找到第1个字符对于的节点
    1. 如果节点有长子,就一直找右兄弟,直到nullptr
    2. 没有长子,则直接连接输入的两个字符

代码如下:

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;
        }
    }
}
posted @ 2022-11-14 00:42  绊缘  阅读(34)  评论(0)    收藏  举报