面試8:找二叉樹的下個結點
關鍵是舉例和畫圖的思想。
主要分三種型別。
1.有右子樹:返回 右子樹的最左節點。
2.無右子樹:2.有父節點:2.是左結點:返回 父節點。
3.無右子樹:3.有父節點:3.是右節點:找到第一個是左結點的節點,返回 該節點的父節點。//這裡的while我出了個bug
4.無右子樹:4.無父節點:返回 空。
我的程式碼。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
//空
if(pNode == nullptr) return nullptr;
//初試化下個節點
TreeLinkNode* pnext = nullptr;
//有右子樹
if(pNode->right != nullptr)
{
pnext = pNode->right;
while(pnext->left != nullptr)
pnext = pnext->left;
}
//無右子樹
else
{
//有父節點
if(pNode->next != nullptr)
{
TreeLinkNode* parent = pNode->next;
//是左子樹
if(pNode == parent->left) pnext = parent;
//是右子樹
else if(pNode == parent->right)
{
TreeLinkNode* current = pNode;
parent = current->next;
while(parent != nullptr && current == parent->right)
{
current = current->next;
parent = current->next;//bug1這裡父節點也變了
}
pnext = current->next;
}
}
//無父結點
else
{
pnext = nullptr;
}
}
return pnext;
}
};
網友的python程式碼
#1.有右子樹,返回 右子樹最左邊的結點
#2.無右子樹,返回 當前結點成為左子樹跟時的父節點
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode):
# write code here
if pNode is None:
return None
#1.有右子樹,為右子樹最左邊的結點
if pNode.right is not None:
node=pNode.right
while node.left is not None:
node=node.left
return node
#2.無右子樹,為當前結點成為左子樹跟時的父節點
if pNode.next is not None:
cur_node=pNode
parent_node=pNode.next
while parent_node is not None and parent_node.left!=cur_node:
cur_node=parent_node
parent_node=cur_node.next
return parent_node
return None
第二種思路
如果無右子樹且父節點存在,只要找到為左結點的節點就好了,返回該節點的父節點。
class Solution:
def GetNext(self, pNode):
# write code here
if pNode is None:
return None
if pNode.right is not None:
pNode = pNode.right
while pNode.left is not None:
pNode = pNode.left
return pNode
while pNode.next is not None:
if pNode.next.left == pNode:
return pNode.next
pNode = pNode.next
return None
相關文章
- 【微軟面試題】在二叉搜尋樹中找最小的大於某個key值的節點微軟面試題
- 二叉樹中最遠的兩個結點的距離二叉樹
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 二叉樹兩個節點的公共節點二叉樹
- 演算法題(三十五):二叉樹的下一個結點演算法二叉樹
- JZ-062-二叉查詢樹的第 K 個結點
- 交換二叉樹中每個結點的左孩子和右孩子二叉樹
- 求二叉樹的給定兩個結點之間的距離二叉樹
- 【資料結構第四周】樹知識點整理(下)【平衡二叉樹】資料結構二叉樹
- 劍指offer 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹
- 008,二叉樹的下一個節點二叉樹
- 快速求完全二叉樹的節點個數二叉樹
- 【資料結構第四周】樹知識點整理(下)【二叉搜尋樹】資料結構
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 程式碼隨想錄——二叉樹-11.完全二叉樹的節點個數二叉樹
- 遞迴求解二叉樹任意一結點的深度遞迴二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 二叉樹的知識點二叉樹
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 二叉樹中兩個節點的最低公共祖先二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 二叉樹的子結構二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 面試題7:重建二叉樹面試題二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 二叉樹的儲存結構二叉樹
- 二叉搜尋樹的結構
- 面試官:什麼是二叉樹面試二叉樹
- [演算法總結] 20 道題搞定 BAT 面試——二叉樹演算法BAT面試二叉樹
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- Java二叉樹排序及任意兩點個節點間的最大距離Java二叉樹排序
- 二叉樹父子節點下標位置關係證明二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 二叉樹的子樹和子結構 c++二叉樹C++
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- 二叉查詢樹的個數
- 二叉樹的五個性質二叉樹