日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 左神算法基础班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

?

轉載于:https://www.cnblogs.com/zzw1024/p/10994766.html

總結

以上是生活随笔為你收集整理的左神算法基础班4_4_3在二叉树中找到一个节点的后继节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。