c++求二叉树的公共祖先

我要实现这样一个操作,层序遍历输入一棵二叉树,当为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;
}

学编程要会调试,什么都靠猜不得累死吗
你第一步要做的是先把树打印出来看,看里面到底存的是个什么,是不是你预期的样子,如果树本身都弄错了,那后面写的越对越是找不到,写错了还可能负负得正呢
如果树本身是对的,那断点跟啊,看从哪一步开始就跟你设计时的规划不一样了