题解 | #二叉树的下一个结点#
二叉树的下一个结点
http://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e
javaScript 题解: 分为三大种情况: 一、该节点有右子树 二、该节点无右子树,但是有父节点。(又分两种情况) 三、该节点无右节点,也没有父节点。 /*function TreeLinkNode(x){ this.val = x; this.left = null; this.right = null; this.next = null; }*/ function GetNext(pNode) { if(pNode === null)return null; let res; //用于存结果 //1.该节点有右子树的处理方式 if(pNode.right){ res = pNode.right; while(res && res.left){ res = res.left; } } //定义一个函数,用于判断某个节点是否是它父节点的左子节点 function isLeft(p){ if(p.next){ return p.next.left === p; } return false; } //2.1该节点无右子树,但是有父节点时 if(!pNode.right && pNode.next){ //2.1.1该节点是其父节点的左子节点时,返回其父节点 if(isLeft(pNode)){ res = pNode.next; } //2.1.2该子节点是其父节点的右子节点时,往上查找 if(!isLeft(pNode)){ let newNode = pNode.next; while(newNode.next && !isLeft(newNode)){ newNode = newNode.next; } res = newNode.next; } } //2.2该节点无右子树,也没有父节点时,直接返回null if(!pNode.right && !pNode.next){ res = null; } return res; }