【剑指offer面试题8】二叉树的下一个节点

二叉树的下一个节点

一.题目要求:

给定一棵二叉树和其中一个节点,如何找出中序遍历的下一个节点?树的节点除了分别有指向左右节点的指针外,还有一个指向父节点的指针。

二.栽树

public class BinaryTreeNode 
{
 char value;
 BinaryTreeNode fatherNode;
 BinaryTreeNode leftNode;
 BinaryTreeNode rightNode;
 public BinaryTreeNode(char value,BinaryTreeNode fatherNode) //构造函数,在这里绑定父节点
 {
  this.value = value;
  this.fatherNode = fatherNode;
 }
 public char getValue() 
 {
  return value;
 }
 public void setValue(char value) 
 {
  this.value = value;
 }
 public BinaryTreeNode getFatherNode() 
 {
  return fatherNode;
 }
 public void setFatherNode(BinaryTreeNode fatherNode) 
 {
  this.fatherNode = fatherNode;
 }
 public BinaryTreeNode getLeftNode()
 {
  return leftNode;
 }
 public void setLeftNode(BinaryTreeNode leftNode) 
 {
  this.leftNode = leftNode;
 }
 public BinaryTreeNode getRightNode() 
 {
  return rightNode;
 }
 public void setRightNode(BinaryTreeNode rightNode) 
 {
  this.rightNode = rightNode;
 } 
}

三.基本想法

主要分三种情况:
1.如果一个节点有右子树,那么它的下一个节点就是它的右子树的最左节点。

2.如果这个节点没有右子树,并且这个节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。

3.如果这个节点既没有右子树,又是它父节点的右子节点,那么它的下一个节点就是从它的父节点向上遍历找到一个是它父节点的左子节点的节点,那么这个节点的父节点就是我们要找的节点。

整理成代码如下:

public BinaryTreeNode findNext(BinaryTreeNode tree) 
 {
  BinaryTreeNode nextNode;
  if(tree==null)
  {
   return null;
  }
  
  if(tree.getRightNode()!=null)//如果有右子树,就是右子树的最左节点
  {
   tree = tree.getRightNode();
   while(tree.getLeftNode()!=null)
   {
    tree = tree.getLeftNode();
   }
   nextNode = tree;
  }
  else if(tree.getFatherNode().getLeftNode()==tree)//如果没有右子树并且是它父节点的左节点
  {
   nextNode=tree.getFatherNode();
  }
  else
  {
   while(tree.getFatherNode().getRightNode()==tree)//既没有右子树,还是父节点的右节点
   {
    tree= tree.getFatherNode();
   }
   
   nextNode= tree.getFatherNode();
  }
  
  
  
  return nextNode;
 }

我们在main函数中构造这个树并进行测试:

public static void main(String[] args) 
 {
  BinaryTreeNode binaryTree = new BinaryTreeNode('a',null);
  binaryTree.leftNode = new BinaryTreeNode('b',binaryTree);
  binaryTree.leftNode.leftNode = new BinaryTreeNode('d',binaryTree.leftNode);
  binaryTree.leftNode.rightNode = new BinaryTreeNode('e',binaryTree.leftNode);
  binaryTree.leftNode.rightNode.leftNode = new BinaryTreeNode('h',binaryTree.leftNode.rightNode);
  binaryTree.leftNode.rightNode.rightNode = new BinaryTreeNode('i',binaryTree.leftNode.rightNode);
  binaryTree.rightNode = new BinaryTreeNode('c',binaryTree);
  binaryTree.rightNode.leftNode = new BinaryTreeNode('f',binaryTree.rightNode);
  binaryTree.rightNode.rightNode = new BinaryTreeNode('g',binaryTree.rightNode);
  
  Test8 t = new Test8();
  System.out.println(t.findNext(binaryTree.leftNode.rightNode.rightNode).getValue());
  
 }

测试结果:
在这里插入图片描述

听起来比较繁琐,但理解了就不难了。如果有更好的方法或者有错误的地方,恳请指正!

发布了47 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41525021/article/details/98219627
今日推荐