二叉树寻找节点x的所有祖先

现在需要寻找链式二叉树节点元素为x的所有祖先并输出。

思路

利用栈进行后序遍历,设立两个栈in 和 out,in用来遍历二叉树,out用来存储输出的信息,仅仅是为了将遍历的节点存起来最后一起输出。


利用栈进行后序遍历的步骤如下:

  1. 节点p从根节点开始一直往右下走并进栈,直到null
  2. 若p为null,则令p = stack.top().left,栈顶的那个元素已经没用了,所以并弹出一个元素。
  3. 若p为null而且栈为空,说明遍历完成。
struct Node {
    int data{0};
    Node *l{nullptr};
    Node *r{nullptr};
};
void posOrder_stack(Node *root) {
    stack<Node *> in, out;
    Node *p = root;
    while (p != nullptr || !in.empty()) {
        if (p == nullptr) p = in.top()->l, in.pop(); //in.top已经没有用了
        else in.push(p), out.push(p), p = p->r;
    }
    while (!out.empty()) {
        cout << out.top()->data << " ";
        out.pop();
    }
    cout << endl;
}

了解了如何利用栈实现二叉树后序遍历,再来看题目,如果遍历的过程中p
节点为x,栈内的剩余的元素就都是她的祖先,注意不是所有的祖先,因为可能有一个祖先被弹出去了,解决方法就是用一个指针来跟踪最近弹出的节点即可。

    void solve(Node *node, int x) {
        stack<Node *> s;
        Node *p = node;  Node *lastPop = nullptr;
        while (p != nullptr || !s.empty()) {
            if (p == nullptr) lastPop = s.top(), p = s.top()->l, s.pop(); 
            else {
                if (p->data == x) break;
                s.push(p),  p = p->r;
            }
        }
        if (lastPop != nullptr) s.push(lastPop);
        while (!s.empty()) cout << s.top()->data << " ", s.pop();
        cout << endl;
    }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
下面是C#实现二叉树节点的所有祖先节点的源代码: ```csharp using System; using System.Collections.Generic; namespace BinaryTreeAncestor { public class Node { public int Value { get; set; } public Node LeftChild { get; set; } public Node RightChild { get; set; } public Node(int value) { Value = value; } //获取当前节点的所有祖先节点 public List<Node> GetAncestors() { List<Node> ancestors = new List<Node>(); Node current = this; while (current != null) { ancestors.Add(current); current = current.Parent; } return ancestors; } //获取当前节点的父节点 public Node Parent { get; set; } } class Program { static void Main(string[] args) { Node root = new Node(1) { LeftChild = new Node(2) { LeftChild = new Node(4), RightChild = new Node(5) }, RightChild = new Node(3) { LeftChild = new Node(6), RightChild = new Node(7) } }; List<Node> ancestors = root.LeftChild.RightChild.GetAncestors(); Console.WriteLine("节点{0}的祖先节点为:", root.LeftChild.RightChild.Value); foreach (Node node in ancestors) { Console.Write(node.Value + " "); } Console.ReadLine(); } } } ``` 在该实现中,我们为节点类添加了一个`Parent`属性,表示当前节点的父节点。然后在`GetAncestors`方法中,我们使用一个`while`循环来遍历当前节点的所有祖先节点,每次将当前节点加入到祖先节点列表中,并将当前节点更新为其父节点,直到当前节点为`null`(即已经遍历到根节点)。最后,在`Main`方法中,我们测试了获取二叉树中某个节点的所有祖先节点的功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值