二叉树的下一个结点
題目
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點并且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
思路
我們以上圖為例進行講解,上圖二叉樹的中序遍歷是d,b,h,e,i,a,f,c,g。我們以這棵樹為例來分析如何找出二叉樹的下一個結點。
1>如果結點是它父結點的左子結點,那么它的下一個結點就是它的父結點。例如,途中結點d的下一個結點是b,f的下一個結點是c。
2>如果一個結點既沒有右子樹,并且它還是父結點的右子結點,這種情形就比較復雜。我們可以沿著指向父結點的指針一直向上遍歷,直到找到一個是它父結點的左子結點的結點。
如果這樣的結點存 在,那么這個結點的父結點就是我們要找的下一個結點。例如,為了找到結點g的下一個結點,我們沿著指向父結點的指針向上遍歷,先到達結點c。由于結點c是
父結點a的右結點,我們繼續向上遍歷到達結點a。由于結點a是樹的根結點。它沒有父結點。因此結點g沒有下一個結點。
#include <iostream> using namespace std;struct node {int val;struct node *l,*r,*p; }; class BTree {public:BTree();void create(struct node *&r);void add_parent(struct node *&r,struct node *p);node *get_next(struct node *r);struct node *root; }; BTree::BTree() {root=NULL; } void BTree::create(struct node *&r) {int x;cin>>x;if(x==0)return;else{r=new node();r->val=x;create(r->l);create(r->r);} } void BTree::add_parent(struct node *&r,struct node *p) {if(r==nullptr)return;r->p=p;p=r;add_parent(r->l,p);add_parent(r->r,p); } node *BTree::get_next(struct node *r) {if(r==nullptr)return nullptr;if(r->r!=nullptr){struct node *curr=r->r;while(curr->l!=nullptr)curr=curr->l;return curr;}else if(r->p!=nullptr){struct node *curr=r;struct node *p=curr->p;while(p!=nullptr&&curr==p->r){curr=p;p=p->p;}return curr;}return nullptr; } int main() {BTree b;b.create(b.root);b.add_parent(b.root,nullptr);struct node *t=b.get_next(b.root);//測試 if(t!=nullptr)cout<<t->val<<endl;elsecout<<" 該結點無下一個結點."<<endl;return 0; }?
轉載于:https://www.cnblogs.com/tianzeng/p/10129024.html
總結
- 上一篇: 钠离子电池能量转化形式
- 下一篇: Linux:网络基础配置