【剑指Offer】面试题8:二叉树的下一个节点
作者:互联网
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 面试题8:二叉树的下一个节点
* 题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
* 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
* @author
* @create 2021-03-11 23:16
*/
public class Solution8 {
public static void main(String[] args) {
TreeLinkNode root = new TreeLinkNode(1);
TreeLinkNode node1 = new TreeLinkNode(2);
TreeLinkNode node2 = new TreeLinkNode(3);
TreeLinkNode node3 = new TreeLinkNode(4);
TreeLinkNode node4 = new TreeLinkNode(5);
TreeLinkNode node5 = new TreeLinkNode(6);
TreeLinkNode node6 = new TreeLinkNode(7);
TreeLinkNode node7 = new TreeLinkNode(8);
TreeLinkNode node8 = new TreeLinkNode(9);
root.left = node1;
root.right = node2;
node1.next = root;
node2.next = root;
node1.left = node3;
node1.right = node4;
node3.next = node1;
node4.next = node1;
node2.left = node5;
node2.right = node6;
node5.next = node2;
node6.next = node2;
node4.left = node7;
node4.right = node8;
node7.next = node4;
node8.next = node4;
TreeLinkNode next = getNextTwo(node8);
System.out.println(next.val);
}
/**
* 方法一:按中序遍历的规律寻找,分三种情况
* @param pNode
* @return
*/
public static TreeLinkNode getNext(TreeLinkNode pNode) {
if (pNode == null){
return null;
}
//①情况一:该节点有右子树,那么该节点的下一个节点是右子树的最左子节点
if (pNode.right != null){
TreeLinkNode pRight = pNode.right;
while (pRight.left != null){
pRight = pRight.left;
}
return pRight;
}
//②情况二:该节点没有右子树,并且为其父节点的左子节点,那么该节点的下一个节点是其父节点
if (pNode.next != null && pNode.next.left == pNode){
return pNode.next;
}
//③情况三:该节点没有右子树,并且为其父节点的右子节点,则我们一直沿着父结点追朔,
//直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点
if (pNode.next != null){
TreeLinkNode parentNode = pNode.next;
while (parentNode.next != null && parentNode != parentNode.next.left){
parentNode = parentNode.next;
}
return parentNode.next;
}
return null;
}
/**
* 方法二:根据给的节点找到根节点,再根据中序遍历找到该节点的下一个节点
* @param pNode
* @return
*/
public static TreeLinkNode getNextTwo(TreeLinkNode pNode) {
if (pNode == null){
return null;
}
TreeLinkNode root = pNode;
while (root.next != null){
root = root.next;//找到根节点
}
//②中序遍历,非递归方式实现
List<TreeLinkNode> list = new ArrayList<>();
Stack<TreeLinkNode> stack = new Stack<>();
TreeLinkNode cur = root;
while (cur != null || !stack.isEmpty()){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur);
cur = cur.right;
}
//③中序遍历找到下一个节点
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == pNode){
return i == list.size() - 1 ? null : list.get(i+1);
}
}
return null;
}
}
class TreeLinkNode{
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val){
this.val = val;
}
}
标签:面试题,Offer,结点,next,TreeLinkNode,pNode,二叉树,null,节点 来源: https://blog.csdn.net/DJames23/article/details/116375784