给定二叉树和此中恣意一个节点,找到在中序遍历中的下一个节点 ...

打印 上一主题 下一主题

主题 571|帖子 571|积分 1713

在给定二叉树和此中一个节点的情况下,假如每个节点除了有指向左右子节点的指针,还有指向父节点的指针,我们可以很方便地找到在中序遍历中的下一个节点。
  1. #include <iostream>
  2. // 定义二叉树节点结构
  3. struct TreeNode {
  4.     int val;
  5.     TreeNode *left;
  6.     TreeNode *right;
  7.     TreeNode *parent; // 指向父节点的指针
  8.     TreeNode(int x) : val(x), left(nullptr), right(nullptr), parent(nullptr) {}
  9. };
  10. class Solution {
  11. public:
  12.     // 获取给定节点在中序遍历中的下一个节点
  13.     TreeNode* getNext(TreeNode* node) {
  14.         if (node == nullptr) return nullptr;
  15.         // 如果当前节点有右子树,返回右子树中最左边的节点
  16.         if (node->right != nullptr) {
  17.             TreeNode* curr = node->right;
  18.             while (curr->left != nullptr) {
  19.                 curr = curr->left;
  20.             }
  21.             return curr;
  22.         } else {
  23.             // 当前节点没有右子树,向上查找
  24.             TreeNode* curr = node;
  25.             TreeNode* parent = node->parent;
  26.             while (parent != nullptr && curr == parent->right) {
  27.                 curr = parent;
  28.                 parent = parent->parent;
  29.             }
  30.             return parent; // 如果 parent 为空,说明当前节点是最后一个节点
  31.         }
  32.     }
  33. };
  34. // 用于测试:中序遍历打印二叉树
  35. void inorderTraversal(TreeNode* root) {
  36.     if (root == nullptr) return;
  37.     inorderTraversal(root->left);
  38.     std::cout << root->val << " ";
  39.     inorderTraversal(root->right);
  40. }
  41. int main() {
  42.     // 创建节点
  43.     TreeNode* node1 = new TreeNode(1);
  44.     TreeNode* node2 = new TreeNode(2);
  45.     TreeNode* node3 = new TreeNode(3);
  46.     TreeNode* node4 = new TreeNode(4);
  47.     TreeNode* node5 = new TreeNode(5);
  48.     // 构建树
  49.     node2->left = node1;
  50.     node1->parent = node2;
  51.     node2->right = node3;
  52.     node3->parent = node2;
  53.     node3->right = node4;
  54.     node4->parent = node3;
  55.     node4->right = node5;
  56.     node5->parent = node4;
  57.     Solution solution;
  58.     // 测试找到下一个节点的功能
  59.     TreeNode* nextNode = solution.getNext(node3);
  60.     if (nextNode != nullptr) {
  61.         std::cout << "节点 " << node3->val << " 的中序遍历下一个节点是: " << nextNode->val << std::endl;
  62.     } else {
  63.         std::cout << "节点 " << node3->val << " 是中序遍历的最后一个节点。" << std::endl;
  64.     }
  65.     return 0;
  66. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表