1. 程式人生 > >左神演算法基礎班4_4_3在二叉樹中找到一個節點的後繼節點

左神演算法基礎班4_4_3在二叉樹中找到一個節點的後繼節點

Problem:
  在二叉樹中找到一個節點的後繼節點
  【題目】 現在有一種新的二叉樹節點型別如下:
  public class Node {
  public int value;
  public Node left;
  public Node right;
  public Node parent;
  public Node(int data) { this.value = data; }
  }
  該結構比普通二叉樹節點結構多了一個指向父節點的parent指標。
  假設有一 棵Node型別的節點組成的二叉樹,
  樹中每個節點的parent指標都正確地指向自己的父節點,
  頭節點的parent指向null。只給一個在二叉樹中的某個節點 node,
  請實現返回node的後繼節點的函式。在二叉樹的中序遍歷的序列中,
  node的下一個節點叫作node的後繼節


Solution:
  在中序遍歷的順序中,每一個節點的後一個節點即為該節點的後繼節點,
  先驅節點即為中序順序的前面節點。

  節點x的後繼節點為:
    【若有右子樹】即為該節點的右子樹最左的節點
    【若無右子樹】:
      通過前驅指標,向上回溯父節點,並判斷該節點是否為該父節點的左子樹,
      若是,則該父節點為該節點的後繼節點。不是,父節點繼續向上回溯其父。
      若一直找不到,則該節點的後繼節點為空。

 

Code:

  

  1 #pragma once
  2 #include <iostream>
  3 #include <vector>
  4 #include <queue>
  5 
  6 using namespace std;
  7 
  8 struct Node
  9 {
 10     int val;
 11     Node* lchild;
 12     Node* rchild;
 13     Node* parent;
 14     Node(int a = -1) :val(a), lchild(NULL), rchild(NULL),parent(NULL) {}
 15 };
 16 
 17 void Create(Node*& root, vector<int>num)//層序構造樹
 18 {
 19     queue<Node*>q;
 20     root = new Node(num[0]);
 21     q.push(root);
 22     int i = 1;
 23     while (i < num.size() && !q.empty())
 24     {
 25         Node* p = q.front();
 26         q.pop();
 27         if (!p)//空節點p
 28             break;
 29         if (num[i] > 0)
 30         {
 31             p->lchild = new Node(num[i++]);
 32             p->lchild->parent = p;
 33         }
 34         if (num[i] > 0)
 35         {
 36             p->rchild = new Node(num[i++]);
 37             p->rchild->parent = p;
 38         }
 39         q.push(p->lchild);
 40         q.push(p->rchild);
 41     }
 42 }
 43 
 44 void MidTravel(Node *root)
 45 {
 46     if (!root)
 47         return;
 48     MidTravel(root->lchild);
 49     cout << root->val << "  ";
 50     MidTravel(root->rchild);
 51 }
 52 
 53 Node* FindNode(Node* node)
 54 {
 55     if (node->rchild)//有右子樹,那麼後繼節點即為右子樹的最左的節點
 56     {
 57         Node* p = node->rchild;
 58         while (p->lchild)
 59             p = p->lchild;
 60         return p;        
 61     }
 62     //無右子樹
 63     //後繼節點為該節點為某個父節點的左子樹
 64     Node *f;//父親指標
 65     f = node->parent;
 66     while (!f)
 67     {
 68         if (node == f->lchild)
 69             return f;
 70         node = f;
 71         f = node->parent;
 72     }
 73     return NULL;
 74 }
 75 
 76 void Test()
 77 {
 78     Node* root = NULL;
 79     vector<int>num = { 1,2,3,4,5,6,7,8,9,10,11,12,-1,-1,-1 };
 80     Create(root, num);//層序構造樹
 81 
 82     cout << "=============檢視中序遍歷==============" << endl;
 83     MidTravel(root);
 84     cout << endl << endl;
 85 
 86     Node* p = NULL;
 87     p = root->rchild;         
 88     cout << "節點 " << p->val << " 的後繼節點為:";
 89     p = FindNode(p);
 90     if (p)
 91         cout << p->val << endl;
 92     else
 93         cout << "空。" << endl;
 94 
 95     p = root->lchild->rchild;
 96     cout << "節點 " << p->val << " 的後繼節點為:";
 97     p = FindNode(p);
 98     if (p)
 99         cout << p->val << endl;
100     else
101         cout << "空。" << endl;
102 
103     p = root->rchild->rchild;
104     cout << "節點 " << p->val << " 的後繼節點為:";
105     p = FindNode(p);
106     if (p)
107         cout << p->val << endl;
108     else
109         cout << "空。" << endl;
110 
111 }
112         

&n