1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| class Sol_successor_predecessor{ public:
void predecessor(TreeNode* root, const TreeNode* const target, int count){ inOrder(root, target, count); predecessor_(root, target); if (res_) cout<<"predecessor node: "<<res_->val<<endl; else cout<<"predecessor node: nullptr"<<endl; count_=0; res_=nullptr; }
void successor(TreeNode* root, const TreeNode* const target, int count){ inOrder(root, target, count); successor_(root, target); if (res_) cout<<"successor node: "<<res_->val<<endl; else cout<<"successor node: nullptr"<<endl; count_=0; res_=nullptr; }
private: int count_ = 0; TreeNode* res_ = nullptr;
void predecessor_(TreeNode* root, const TreeNode* const target){ if (root!=nullptr ){ predecessor_(root->left, target); count_--; if (count_ == 1){ res_ = root; return; } predecessor_(root->right, target); } }
void successor_(TreeNode* root, const TreeNode* const target){ if (root!=nullptr ){ successor_(root->left, target); count_--; if ( count_ == -1){ res_ = root; return; } successor_(root->right, target); } }
void inOrder(TreeNode* root, const TreeNode* const target, int& count){ if (root!=NULL){ inOrder(root->left, target, count); count++; if (root->val == target->val){ count_ = count; return; } inOrder(root->right, target, count); } } };
|