目录
题目描述
坎坷
题解
题目描述
之前做过一道类似的题目(简单来说就是原题.)题目说就是给定一个二叉树,搜索公共祖先,思路也是一次遍历,使用数组存储从根节点到目标节点的路径,再根据两条路径来确定最近公共祖先.
坎坷
本来使用两个指针依次遍历两个vector
缝缝补补了半天,终于还是决定看题解.
题解
优化:使用一个TreeNode*节点,当两个vector
为什么不使用双指针分别指向数组头部?
因为在分叉点之前,两者存储的内容都是一样的,这明显是很浪费数组空间的,所以我们只需要一个TreeNode节点空间来存储即可.
#include#include using namespace std; struct TreeNode { int val; struct TreeNode* left, * right; }; vector vec; vector > res; void get(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == p) { vec.push_back(root); res.push_back(vec); vec.pop_back(); } if (root == q) { vec.push_back(root); res.push_back(vec); vec.pop_back(); } vec.push_back(root); if (root->left) get(root->left, p, q); if (root->right) get(root->right, p, q); vec.pop_back(); } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (!root) return nullptr; if (p == q) return p; TreeNode* ancestor = nullptr; get(root, p, q); for (int i = 0; i < res[0].size()&&i > ch; if (ch == '@') return nullptr; TreeNode* tempNode = (TreeNode*)new TreeNode(); if (tempNode == nullptr) { cout << "内存分配失败"; return NULL; } tempNode->val = ch-'0'; cout << "请输入节点 " << ch << " 的左节点: "; tempNode->left = CreateBiTree(); cout << "请输入节点 " << ch << " 的右节点: "; tempNode->right = CreateBiTree(); return tempNode; } void preOrder(TreeNode* root) { if (!root) return; cout << root->val<<" "; preOrder(root->left); preOrder(root->right); return; } int main() { TreeNode* temp; TreeNode* root; cout << "请输入根节点的值: "; root = CreateBiTree(); preOrder(root); temp = lowestCommonAncestor(root,root->left->left->left,root->right); cout < val<< endl; preOrder(root); return 0; }



