剑指Offer面试题58:二叉树的下一个节点
2016-10-14 21:36
477 查看
题目:二叉树的下一个节点
给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。
算法分析:
整个算法中需要考虑的二叉树情况分为两类:
1.有右子树的:那么下个结点就是右子树最左边的点;
2.没有右子树的:
a)是父节点左孩子,那么父节点就是下一个节点 ;
b)是父节点的右孩子,找他的父节点...直到当前结点是其父节点的左孩子位置。返回该节点的父节点,如果没有,那么他就是尾节点。
如下二叉树:
a
b c
d e f g
h i
该二叉树的中序遍历结果为d,b,h,e,i,a,f,c,g.所以,如果输入节点i,则输出i的下一个节点a;如果输入节点f,则输出f的下一个节点c.
算法源程序:
程序运行结果:
给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。
算法分析:
整个算法中需要考虑的二叉树情况分为两类:
1.有右子树的:那么下个结点就是右子树最左边的点;
2.没有右子树的:
a)是父节点左孩子,那么父节点就是下一个节点 ;
b)是父节点的右孩子,找他的父节点...直到当前结点是其父节点的左孩子位置。返回该节点的父节点,如果没有,那么他就是尾节点。
如下二叉树:
a
b c
d e f g
h i
该二叉树的中序遍历结果为d,b,h,e,i,a,f,c,g.所以,如果输入节点i,则输出i的下一个节点a;如果输入节点f,则输出f的下一个节点c.
算法源程序:
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:二叉树的下一个节点 * 给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。 * 输入描述:无 * 程序输出:该二叉树的中序遍历结果是:d,b,h,e,i,a,f,c,g * i的中序遍历的下一个节点是:a * 问题分析: 无 * 算法描述:整个算法中需要考虑的二叉树情况分为两类: * 1.有右子树的:那么下个结点就是右子树最左边的点; * 2.没有右子树的: * a)是父节点左孩子,那么父节点就是下一个节点 ; * b)是父节点的右孩子,找他的父节点...直到当前结点是其父节点的左孩子位置。返回该节点的父节点,如果没有,那么他就是尾节点。 * 如下二叉树: * a * b c * d e f g * h i *该二叉树的中序遍历结果为d,b,h,e,i,a,f,c,g.所以,如果输入节点i,则输出i的下一个节点a;如果输入节点f,则输出f的下一个节点c. * 完成日期:2016-10-14 ***************************************************************/ package org.marsguo.offerproject58; class TreeNode{ TreeNode left = null; TreeNode right = null; TreeNode parent = null; char val; public TreeNode(char val){ this.val = val; } public String toString(){ return val +""; } } class BinaryTree{ public TreeNode BinaryFunction(TreeNode pNode){ if(pNode == null) return null; TreeNode pNext = null; if(pNode.right != null){ //如果有右子树,则找右子树的最左节点 TreeNode pRight = pNode.right; while(pRight.left != null) pRight = pRight.left; pNext = pRight; } else if(pNode.parent != null){ TreeNode pCurrent = pNode; TreeNode pParent = pNode.parent; while(pParent != null && pParent.right == pCurrent){ //向上找,直到找到最顶上的顶点,即N1 pCurrent = pParent; //当前节点和父节点不断交换 pParent = pParent.parent; } pNext = pParent; } return pNext; } } public class BinaryTreeNode { public static void main(String[] args){ BinaryTree binarytree = new BinaryTree(); TreeNode n1 = new TreeNode('a'); TreeNode n2 = new TreeNode('b'); TreeNode n3 = new TreeNode('c'); TreeNode n4 = new TreeNode('d'); TreeNode n5 = new TreeNode('e'); TreeNode n6 = new TreeNode('f'); TreeNode n7 = new TreeNode('g'); TreeNode n8 = new TreeNode('h'); TreeNode n9 = new TreeNode('i'); n1.left = n2; n1.right = n3; n2.left = n4; n2.parent = n1; n2.right = n5; n3.left = n6; n3.parent = n1; n3.right = n7; n4.parent = n2; n5.left = n8; n5.parent = n2; n5.right = n9; n6.parent = n3; n7.parent = n3; n8.parent = n5; n9.parent = n5; System.out.println("该二叉树的中序遍历结果是:d,b,h,e,i,a,f,c,g"); System.out.print(n9 + "的中序遍历的下一个节点是:"); System.out.println(binarytree.BinaryFunction(n9)); } }
程序运行结果:
相关文章推荐
- 剑指offer面试题58 二叉树的下一个节点(Java实现)
- 剑指Offer(第二版)面试题8:二叉树的下一个节点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 剑指Offer实现面试题8-二叉树的下一个节点
- 面试题58:二叉树的下一个节点
- 剑指offer-面试题58:二叉树的下一个结点
- 剑指offer面试题[58]-二叉树的下一个结点
- (剑指Offer)面试题58:二叉树的下一个结点
- 剑指offer-面试题58-二叉树的下一个结点
- 面试题58-二叉树的下一个结点
- <剑指offer 面试题8>二叉树的下一个节点(Java)
- 58 - 二叉树的中序遍历的下一个节点
- (php实现剑指offer)二叉树的下一个节点
- 面试题58 二叉树的下一个结点
- 剑指offer(二叉树的下一个节点)
- 【剑指Offer学习】【面试题58:二叉树的下一个结点】
- 《剑指offer》编程题java实现(二十八):二叉树的下一个节点
- 剑指offer 58 - 二叉树的下一个节点
- 面试题58:二叉树的下一个结点
- 【剑指Offer】面试题58:二叉树的下一个结点