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



  • 相关阅读:
    Luogu P4316 绿豆蛙的归宿 题解报告
    Luogu P1850 换教室(NOIP 2016) 题解报告
    Rainbow的信号 题解报告
    $CH5105 Cookies$ 线性$DP+$贪心
    算法竞赛 $0×50$ 动态规划 (+一本通
    $CH5104 I-country$ 线性$DP$
    洛谷$2014$ 选课 背包类树形$DP$
    $SP703 Mobile Service DP$
    $POJ1015 Jury Compromise Dp$/背包
    $POJ1742 Coins$ 多重背包+贪心
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4293494.html
Copyright © 2020-2023  润新知