新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

题目:将一个二叉查找树按照中序遍历转换成双向链表。

给定一个二叉查找树:

    4
   /   2   5
 / 1   3

返回 1<->2<->3<->4<->5

思路:如果对于当前节点,把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可。

Java代码:这个是借鉴九章里面的解题法。但是对于左右子树转换成二叉树也不是很理解,还待需要继续分析。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 * Definition for Doubly-ListNode.
 * public class DoublyListNode {
 *     int val;
 *     DoublyListNode next, prev;
 *     DoublyListNode(int val) {
 *         this.val = val;
 *         this.next = this.prev = null;
 *     }
 * }
 */ 

class ResultType {
    DoublyListNode first, last;

    public ResultType(DoublyListNode first, DoublyListNode last) {
        this.first = first;
        this.last = last;
    }
}

public class Solution {
    /**
     * @param root: The root of tree
     * @return: the head of doubly list node
     */
    public DoublyListNode bstToDoublyList(TreeNode root) {
        if (root == null) {
            return null;
        }

        ResultType result = helper(root);
        return result.first;
    }

    public ResultType helper(TreeNode root) {
        if (root == null) {
            return null;
        }

        ResultType left = helper(root.left);
        ResultType right = helper(root.right);
        DoublyListNode node = new DoublyListNode(root.val);

        ResultType result = new ResultType(null, null);

        if (left == null) {
            result.first = node;
        } else {
            result.first = left.first;//?????
            left.last.next = node;
            node.prev = left.last;
        }

        if (right == null) {
            result.last = node;
        } else {
            result.last = right.last;//?????
            right.first.prev = node;
            node.next = right.first;
        }

        return result;
    }
}
时间: 2024-08-09 06:18:10

新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)的相关文章

二叉树(2)----中序遍历,递归和非递归实现

1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.中序遍历 定义:首先访问左子树,然后访问根节点,最后访问右子树

数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现

代码很短,实现起来也很简单,下面是代码: // // main.cpp // PreMidgetPost // // Created by xin wang on 4/29/15. // Copyright (c) 2015 xin wang. All rights reserved. // #include <iostream> //链表二叉树的节点类 template <class T> class BinaryTreeNode{ public: BinaryTreeNode(

已知二叉树的前序和中序遍历,重构该二叉树

这套题来自于牛客网剑指offer的第四题,由于本题涉及到了对树的递归操作,而且在边界上自己计算时犯了小错误,这里记录一下: 题目描述如下: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 解题思路: 1.由树的先序遍历可以求树的根节点, 2.根据根节点的位置在中序遍历中找到树左右子树的元素, 3.递

二叉树的前序,中序遍历

前序递归于循环 #include <iostream> #include <stack> using namespace std; struct TreeNode { int val; TreeNode *left,*right; }; void create(TreeNode *&p) { int k; cin>>k; //1 2 0 0 3 0 0; if(k!=0) { p=new TreeNode; p->val=k; create(p->l

新手学习算法----二叉树(后序遍历)

这种算法只用到了一次入栈一次出栈就可以了, //首先将根节点的左节点所有的节点入栈,一直到叶子节点,先将最左的叶子节点入栈,然后判断是否已到了叶子节点,如果是则将节点的value值入栈,接着将此节点出栈,因为他没用改了 public ArrayList<Integer> postorderTraversal(TreeNode root) { // write your code here Stack<TreeNode> s = new Stack<TreeNode>()

LeetCode:二叉树的非递归中序遍历

第一次动手写二叉树的,有点小激动,64行的if花了点时间,上传leetcode一次点亮~~~ 1 /* inorder traversal binary tree */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 6 struct TreeNode { 7 int val; 8 struct TreeNode *left; 9 struct TreeNode *right; 10 }; 11 12 int* inorderTrave

算法之将一个16进制的字符串转换成整数返回

public class HexToInt { public static void main(String[] args) { String str = "13abf"; convert(str); } private static int convert(String str) { int len = str.length(); int sum = 0; for (int i = 0; i < len; i++) { char c = str.charAt(len-1-i);

Python实现二叉树的非递归中序遍历

思路: 1. 使用一个栈保存结点(列表实现): 2. 如果结点存在,入栈,然后将当前指针指向左子树,直到为空: 3. 当前结点不存在,则出栈栈顶元素,并把当前指针指向栈顶元素的右子树: 4. 栈不为空,循环2.3部. 代码如下,解决了leetcode94. Binary Tree Inorder Traversal: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): #

第五章&#160;二叉树(e2)中序遍历

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/10258541.html