二叉树的下一个节点——《剑指offer》

二叉树的下一个节点——《剑指offer》,第1张

  1. 题目描述:给定一个二叉树和其中一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向夫节点的指针。
  2. 思想:①当前节点有右子树时,则下一节点是右子树的最左节点。②当前节点没有右子树,但自己是父节点的左孩子时,则下一个节点是父节点。③当前结点既没有右孩子,自己又不是左孩子时,则找到第一个是左孩子的祖先节点,该节点的父亲结点就是下一个结点。④如果当前结点既没有右孩子,又不是左孩子,又没有父节点时,或没有作为左孩子的祖先节点时,则该结点是中序遍历的最后一个结点。
  3. 代码实现:
    typedef struct node {
    	int data;
    	struct node* left;
    	struct node* right;
    	struct node*parent;
    }Node,*PNode;
    
    PNode GetNext(PNode p) {
    	if (p == NULL) {
    		return NULL;
    	}
    
    	PNode next = NULL;
    
    	if (p->right != NULL) { //有右子树
    		next = p->right;
    		while (next->left != NULL) {
    			next = next->left;
    		}
    	}
    	else if (p->parent == NULL) { //无右子树且无父节点,即为无右子树的根结点
    		next = NULL;
    	}
    	else {//无右子树但有根结点,找出第一个是左子树的祖先节点,这个节点的父结点就是下一个结点
    		PNode Pcurrent = p, Pparent = p->parent;
    		while (Pparent != NULL && Pcurrent != Pparent->left) {
    			Pparent = Pparent->parent;
    			Pcurrent = Pcurrent->parent;
    		}//循环结束后,父节点为空时,代表没有作为左子树的祖先节点;或当前结点是左子树,则返回其父节点
    
    		next = Pparent;
    	}
    
    	return next;
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存