力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾

二叉搜索树与双向链表/二叉搜索树

  • 问题
  • 我的代码
  • 示例代码
  • 二叉树

问题

来自力扣:

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

为了让您更好地理解问题,以下面的二叉搜索树为例:

力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾_第1张图片

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾_第2张图片

我的代码

二叉搜索树的特点:大于左节点,小于右节点。
所以我的办法就是先利用中序遍历,把节点存入一个vector中,然后按索引对指针进行修改就行了。
中序遍历:先遍历左分支,再遍历自己,最后遍历右分支。


#include 
using namespace std;
#include 
#include 
#include
#include 
#include 
#include
#include
#include
#include
#include

class Node {
public:
	int val;
	Node* left;
	Node* right;

	Node() {}

	Node(int _val) {
		val = _val;
		left = NULL;
		right = NULL;
	}

	Node(int _val, Node* _left, Node* _right) {
		val = _val;
		left = _left;
		right = _right;
	}
};

class Solution {
private:
	vector<Node*> vN;
public:

	Node* treeToDoublyList(Node* root) {
		
		stack<Node*> sN;
		if (root == NULL) return root;
		inorderTraversal(root);
		int count = vN.size();
		for (int i = 0; i < count; ++i) {
			if(i==0)
			 vN[i]->left = vN[count - 1];
			else
			 vN[i]->left = vN[i - 1];
			if(i==count-1)
			 vN[i]->right = vN[0];
			else
			 vN[i]->right = vN[i + 1];
		}
		return vN[0];
	}

	void inorderTraversal(Node* root){
		if (root->left)
			inorderTraversal(root->left);
		vN.emplace_back(root);
		if (root->right)
			inorderTraversal(root->right);
	}
};
int main() {
	Solution mysolution;
	Node* root = NULL;
	root = new Node(4);
	root->left = new Node(2);
	root->right = new Node(5);
	root->left->left = new Node(1);
	root->left->right = new Node(3);
	Node* Dhead = mysolution.treeToDoublyList(root);
	Node* tmp = Dhead;
	while (tmp!=NULL) {
		cout << tmp->val<<" ";
		tmp = tmp->left;
		if (tmp == Dhead) break;
	}
	while (tmp != NULL) {
		cout << tmp->val << " ";
		tmp = tmp->right;
		if (tmp == Dhead) break;
	}
	return 0;
}

示例代码

这次的示例代码是从评论区找的(作者和地址也放代码里了),提交页面给的示例代码可读性不太好懂。
示例代码没有用vector来存储,有好有坏。
好处:建撒后存储空间占用。
坏处:代码理解起来没有我的好。

class Solution {
public:
    Node* treeToDoublyList(Node* root) {
        if(root == nullptr) return nullptr;
        dfs(root);
        head->left = pre;
        pre->right = head;
        return head;
    }
private:
    Node *pre, *head;
    void dfs(Node* cur) {
        if(cur == nullptr) return;
        dfs(cur->left);
        if(pre != nullptr) pre->right = cur;
        else head = cur;
        cur->left = pre;
        pre = cur;
        dfs(cur->right);
    }
};

作者:jyd
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/solution/mian-shi-ti-36-er-cha-sou-suo-shu-yu-shuang-xian-5/

二叉树

参考文章
二叉树条件:有序;每个节点最多只有2个子节点。
力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾_第3张图片
满二叉树:除了叶子节点,其它节点都有2个子节点。
力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾_第4张图片
完全二叉树:除去最后一层节点后,是满二叉树;且最后一层的节点都是从左到右分布的。
力扣刷题笔记24——二叉搜索树与双向链表/二叉搜索树/二叉树简单回顾_第5张图片

你可能感兴趣的:(算法题,leetcode,数据结构,回溯,算法)