51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点

题目:一个二叉树,中序遍历,找一个节点的后一个节点


二叉树相关的题目问了很多,今儿去面试又被问到了,这里做一个总结。

类似的题目有:

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;
        }
}


1)找二叉树的最左节点

//找二叉树的最左节点
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;
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值