首页 > 其他分享 >剑指offer:二叉搜索树与双向链表

剑指offer:二叉搜索树与双向链表

时间:2022-12-01 19:02:56浏览次数:42  
标签:pRootOfTree right TreeNode offer 二叉 链表 NULL stk left


题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

1.递归

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:

TreeNode* leftLast=NULL;

TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL){
return NULL;
}

TreeNode* left=Convert(pRootOfTree->left);

if(left){
leftLast->right=pRootOfTree;
pRootOfTree->left=leftLast;

}

leftLast=pRootOfTree;

TreeNode* right=Convert(pRootOfTree->right);

if(right){
right->left=pRootOfTree;
pRootOfTree->right=right;
}

return left==NULL?pRootOfTree:left;
}
};
添加笔记

2.利用非递归的中序遍历

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
stack<TreeNode*> stk;
TreeNode* p=pRootOfTree;

TreeNode* newRoot=NULL;
TreeNode* pre=NULL;
bool isFirst=true;

while(p!=NULL || !stk.empty()){
while(p!=NULL){
stk.push(p);
p=p->left;
}

if(!stk.empty()){
p=stk.top();
stk.pop();

if(isFirst){
isFirst=false;
newRoot=p;
pre=p;
}else{
pre->right=p;
p->left=pre;
pre=p;
}

p=p->right;

}

}

return newRoot;
}
};

用非递归可以更加的清晰


标签:pRootOfTree,right,TreeNode,offer,二叉,链表,NULL,stk,left
From: https://blog.51cto.com/u_15899184/5903619

相关文章

  • 剑指offer:二叉树中和为某一值的路径
    题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/***Definiti......
  • 剑指offer:数组中出现次数超过一半的数字
    题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因......
  • 剑指offer:复杂链表的复制
    题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。/*structRandomListNode{intlabel;structRandom......
  • 剑指offer:数组中的逆序对
    题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。classSolution{public:intInv......
  • 剑指offer:最小的K个数
    题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。方法一O(n)改变输入,适合小数据classSolution{public:vector<i......
  • 剑指offer:翻转单词顺序列
    题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“s......
  • 二叉树前序遍历(python)
    具体做法:step1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。step2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。step3:依次......
  • 二叉树中序遍历(python)
    def inorder(self, list: List[int], root: TreeNode):        # 遇到空节点则返回        if not root:            return ......
  • 删除有序链表中的重复元素(python)
    重复的留下一个def deleteDuplicates(self , head: ListNode) -> ListNode:        # write code here        #空链表        if ......
  • 判断是不是完全二叉树
      图1,图2是完全二叉树 图3不是完全二叉树  import java.util.*;/* * public class TreeNode { *   int val = 0; *   TreeNode lef......