左神演算法基礎班4_4_3在二叉樹中找到一個節點的後繼節點
阿新 • • 發佈:2019-06-09
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