小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:树
数据结构类算法总结:树
1.题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2.思路解析:
中序遍历中,如果一个结点有右子树,那么他的下一个结点就是他的右子树中的最左子结点,也就说,从右子节点出发一直沿着指向左子结点的指针,我们就能找到他的下一个结点。
如果一个结点没有右子树,如果结点是他父节点的左子结点,那么他的下一个结点就是他的父节点;
如果一个结点既没有右子树并且他还是他父节点的右子结点,这种情况就比较复杂,我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是他父节点的左子结点的结点,如果这样的节点存在,那么这个父节点就是我们要找的下一个结点
3.代码实现:
public class Solution57 { private static class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } } public static void main(String[] args) { TreeLinkNode t1 = new TreeLinkNode(1); TreeLinkNode t2 = new TreeLinkNode(2); TreeLinkNode t3 = new TreeLinkNode(3); TreeLinkNode t4 = new TreeLinkNode(4); TreeLinkNode t5 = new TreeLinkNode(5); TreeLinkNode t6 = new TreeLinkNode(6); TreeLinkNode t7 = new TreeLinkNode(7); t1.left = t2; t1.right = t3; t2.left = t4; t2.right = t5; t2.next = t1; t3.left = t6; t3.right = t7; t3.next = t1; t4.next = t2; t5.next = t2; t6.next = t3; t7.next = t3; Solution57 s = new Solution57(); TreeLinkNode t = s.GetNext(t6); System.out.println(t.val); } public TreeLinkNode GetNext(TreeLinkNode pNode){ //如果头结点为空 if(pNode == null) return null; //如果当前结点是每层中间根结点,其右子树不为空,则访问右结点左子树中不为空的左叶子结点 if(pNode.right != null){ pNode = pNode.right; while(pNode.left != null){ pNode = pNode.left; } return pNode; } //如果当前结点是其父结点的左孩子,则下一个结点即为父节点;否则继续向上遍历其父节点的父节点,重复之前的判断返回结果 while(pNode.next != null){ //左孩子下一个结点即为父节点 TreeLinkNode pRoot = pNode.next; if(pRoot.left == pNode){ return pRoot; } pNode = pNode.next; } return null; } }