《剑指offer》-- 二叉树的下一个结点

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

题目描述:

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

解题思路:

/**
* 思路:
*
* 对于一个节点,其后续节点有三种形式:
* 1. 该节点的右指针为null,那么就往前找其父节点(设为a),
* 若a是其父节点的左子节点,那么下一个节点就是a的父节点,否则,就一直往上找,找到该节点为其父节点的左节点位置;
* 如果一直找到了跟节点(即其父节点为null),那么久返回null
* 2. 该节点是的右指针不为null,那么找其右子树的第一个节点
*
*/

本道题目不难,树遍历基本的三种方式,本道题的以上思路,可以综合在一个代码当中完成,也可以分功能到不同的函数内部,这是两种小细节的处理方式,我是使用的第二种,即在寻找右子树中序遍历下的第一个节点时,递归调用。

code:

/**
 * 题目描述
 * 
 * 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
 * 
 * date: 2016.4.2	10:53
 * @author SSS
 *
 */
public class Solution {
	
	public TreeLinkNode GetNext(TreeLinkNode pNode) {
		TreeLinkNode resultNode  = null;
		
		// 总体情况分为该节点右指针是否为0,若不为null,那么其下一个节点一定在右子树上,否则就要往上寻找
		if (pNode.right != null) {
			resultNode = getFirstNodeOfInOrder(pNode.right);
			
		} else {	// 往上找
			TreeLinkNode parentNode = pNode.next;
			TreeLinkNode tempNode = pNode;
			while(parentNode != null) {
				if (parentNode.left == tempNode) {  // 该节点为父节点的左节点,那么父节点就是中序遍历的下一个节点
					resultNode = parentNode;
					break;
				} else { // 否则就一直往上遍历
					tempNode = parentNode;
					parentNode = parentNode.next;
				}
			}
			// 这种情况是一直遍历到整个树的根节点
			if (parentNode == null) {
				resultNode = null;
			}
			
		}
		
		return resultNode;
	}
	
	/**
	 * 在中序遍历下,找到该节点的下一个节点,前提是当前节点是非空
	 * @param node
	 * @return
	 */
	public TreeLinkNode getFirstNodeOfInOrder(TreeLinkNode node) {
		TreeLinkNode resultNode  = node;
		if(node.left == null) {
			return node;
		}
		
		resultNode = getFirstNodeOfInOrder(node.left);
		
		return resultNode;
	}
	/*
	public static void main(String []args) {
		
		Solution solution = new Solution();
		
		TreeLinkNode rootNode = new TreeLinkNode(4);
		TreeLinkNode aNode = new TreeLinkNode(23);
		TreeLinkNode bNode = new TreeLinkNode(12);
		rootNode.left = aNode;
		rootNode.right = bNode;
		aNode.next = rootNode;
		bNode.next = rootNode;
		
		TreeLinkNode cNode = new TreeLinkNode(1);
		TreeLinkNode dNode = new TreeLinkNode(65);
		aNode.left = cNode;
		aNode.right = dNode;
		cNode.next = aNode;
		dNode.next = aNode;
		
		TreeLinkNode eNode = new TreeLinkNode(234);
		TreeLinkNode fNode = new TreeLinkNode(64);
		bNode.left = eNode;
		bNode.right = fNode;
		eNode.next = bNode;
		fNode.next = bNode;
		
		TreeLinkNode resultNode = solution.GetNext(bNode);
		
		if (resultNode != null) {
			System.out.println(resultNode.val);
		} else {
			System.out.println("null");
		}
		
	}*/
}

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

你可能感兴趣的:(算法,java,牛客,剑指offer,二叉树,中序遍历,下一个节点)