题目:一个二叉树,中序遍历,找一个节点的后一个节点
二叉树相关的题目问了很多,今儿去面试又被问到了,这里做一个总结。
类似的题目有:
1)找二叉树的最左节点
2)找二叉树的最右节点
3)中序遍历二叉树,并打印出来。
4)判断一个二叉树是不是完全二叉树。
。。。
后续再添加
这题的思路:
中序遍历的树的过程是:左--》中--》右
要找当前节点,先判断此节点有没有右子树?
--------- 有,则找右子树的最左节点
--------- 没有,则父节点,并且此父节点的左子树为此节点分支。
算法如下:
//二叉树节点定义
struct Node{
Node* parent;
int data;
Node* left;
Node* right;
};
//中序排序找当前节点的后一个节点
Node* find(Node* p)
{
if(p == NULL) return NULL;
if(p->right)//有右孩子
{
//找右子树中的最左节点
Node* cp = p->right;
while(cp->left)
{
cp = cp->left;
}
return cp;
}
else//没有右孩子
{
//找此节点的第一个父节点的左孩子是此分支。
Node* pp = p->parent;
while(pp && pp->right == p)
{
p = pp;
pp = p->parent;
}
return pp;
}
}
//找二叉树的最左节点
Node* findleft(Node* p)
{
if(!p) return NULL;
Node* pp = p;
while(pp->left)
{
pp = pp->left;
}
return pp;
}
2)找二叉树的最右节点
//找二叉树的最右节点
Node* findright(Node* p)
{
if(!p) return NULL;
Node* pp = p;
while(pp->right)
{
pp = pp->right;
}
return pp;
}
3)中序遍历二叉树,并打印出来。
//中序遍历二叉树,并打印出来。
void print_mid(Node* p)
{
if(p == NULL) return;
//打印节点p的左子树
print_mid(p->left);
//打印节点p
cout << p->data << ",";
//打印节点p的右子树
print_mid(p->right);
}
4)判断一个二叉树是不是完全二叉树。
bool is_complete(tree *root)
{
queue q;
tree *ptr;
// 进行广度优先遍历(层次遍历),并把NULL节点也放入队列
q.push(root);
while ((ptr = q.pop()) != NULL)
{
q.push(ptr->left);
q.push(ptr->right);
}
// 判断是否还有未被访问到的节点
while (!q.is_empty())
{
ptr = q.pop();
// 有未访问到的的非NULL节点,则树存在空洞,为非完全二叉树
if (NULL != ptr)
{
return false;
}
}
return true;
}