面試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
相關文章
- 二叉搜尋樹的第 k 個結點
- 劍指offer 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹
- JZ-062-二叉查詢樹的第 K 個結點
- 面試題7:重建二叉樹面試題二叉樹
- 演算法題(三十五):二叉樹的下一個結點演算法二叉樹
- 面試官:什麼是二叉樹面試二叉樹
- 面試小結--前端面試的幾個雷點面試前端
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- 008,二叉樹的下一個節點二叉樹
- [演算法總結] 20 道題搞定 BAT 面試——二叉樹演算法BAT面試二叉樹
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- 交換二叉樹中每個結點的左孩子和右孩子二叉樹
- PHP面試:說說你理解的二叉樹吧PHP面試二叉樹
- Leetcode 二叉樹題目集合 (看完這個面試不會做二叉樹題,辣條給你!!!!!)LeetCode二叉樹面試
- 面試題37:序列化二叉樹面試題二叉樹
- 別再翻了,面試二叉樹看這 11 個就夠了~面試二叉樹
- 快速求完全二叉樹的節點個數二叉樹
- LeetCode題解(面試02.08):尋找連結串列與環的交點(Python)LeetCode面試Python
- 二叉搜尋樹的2層結點統計
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 程式碼隨想錄——二叉樹-11.完全二叉樹的節點個數二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- LeetCode-222-完全二叉樹的節點個數LeetCode二叉樹
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- 二叉樹的知識點二叉樹
- 相同二叉樹和鏡面二叉樹問題二叉樹
- Day16 | 104.二叉樹的最大深度 、111.二叉樹的最小深度 、222.完全二叉樹的節點個數二叉樹
- 二叉樹的子結構二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 面試總結:Promise有關面試的知識點。面試Promise
- 幾道和「二叉樹」有關的演算法面試題二叉樹演算法面試題
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- 二叉樹的儲存結構二叉樹
- 二叉搜尋樹的結構
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 一道關於二叉樹的位元組面試題的思考二叉樹面試題