我要实现这样一个操作,层序遍历输入一棵二叉树,当为0时表示为null,并且找到最近公共祖先
现在我已经建了一棵树
2
/
3 4
5 6 7 8
如果求3,4 的祖先,就能返回2,
现在求5,8的祖先,就没有返回值
是怎么回事呢?
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef int type;
typedef struct treeNode {
type data;
treeNode* left;
treeNode* right;
}treeNode;
treeNode* creatBinTree(vector<int> arr) {
queue q;
if (arr.empty()) {
return nullptr;
}
treeNode* head = new treeNode;
head->data = arr[0];
q.push(head);
treeNode* bt;
int i = 1;
while (!q.empty()) {
bt = q.front();
q.pop();
if (i < arr.size()) {
if (arr[i] == 0)
{
bt->left = nullptr;
i++;
}
else
{
bt->left = new treeNode;
bt->left->data = arr[i];
q.push(bt->left);
i++;
}
}
else {
bt->left = nullptr;
}
if (i < arr.size()) {
if (arr[i] == 0)
{
bt->right = nullptr;
i++;
}
else {
bt->right = new treeNode;
bt->right->data = arr[i];
q.push(bt->right);
i++;
}
}
else {
bt->right = nullptr;
}
}
return head;
}
treeNode* anc(treeNode* root, int p, int q)
{ if (root->data == q || root->data == p || root== nullptr)
{return root;}
treeNode* left = anc(root->left, p, q);
treeNode* right = anc(root->right, p, q);
if (left != nullptr && right != nullptr)
{return root; }
else if (left ==nullptr&&right !=nullptr)
{ return right; }
else if (left !=nullptr&&right ==nullptr)
{ return left; }
}
int main() {
vector<int> a;
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
a.push_back(6);
a.push_back(7);
a.push_back(8);
treeNode* tou=creatBinTree(a);
//cout<right->data;
cout<left->right->data;
cout<<anc(tou,5,8)->data;
}
学编程要会调试,什么都靠猜不得累死吗
你第一步要做的是先把树打印出来看,看里面到底存的是个什么,是不是你预期的样子,如果树本身都弄错了,那后面写的越对越是找不到,写错了还可能负负得正呢
如果树本身是对的,那断点跟啊,看从哪一步开始就跟你设计时的规划不一样了