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



你可能感兴趣的:(面试题)