Javascript:将二进制搜索树转换为双向链表的算法

时间:2016-08-18 01:34:25

标签: javascript algorithm linked-list binary-search-tree

我正在尝试编写将BST转换为双向链表的算法。这就是我到目前为止所拥有的。以下是代码:

function TreeNode(val) {
     this.val = val;
     this.left = this.right = null;
}

function BinaryTree() {
    this.root = null;
}
 
BinaryTree.prototype.push = function(val) {
    var root = this.root;
    
    if(!root) {
        this.root = new TreeNode(val);
        return;
    }
    
    var currentNode = root;
    var newNode = new TreeNode(val);
    
    while(currentNode) {
        if (val < currentNode.val) {
        	if(!currentNode.left) {
            currentNode.left = newNode;
            break;
          } else {
              currentNode = currentNode.left;
          }
        } else if(val > currentNode.val) {
        	if(!currentNode.right) {
            currentNode.right = newNode;
            break;
          } else {
              currentNode = currentNode.right;
          }
        }
    }
}
var bt = new BinaryTree();
bt.push(4);
bt.push(2);
bt.push(5);
bt.push(1);
bt.push(3);
//console.log(bt);
//var node = bt.root;
function Node(node) {
  //this.data = value;
  //this.previous = this.next = null;
  var head = null;
  var tail = null;
  var prev = null;
  console.log(bstToLL(node, head, prev, tail));
}


//function DoublyLinkedList() {
//  this.head = null;
//  this.prev = null;
//  this.tail = null;
//}

function bstToLL(node, head, prev, tail) {
	if (node === null) {
  	return;
  }
  
  bstToLL(node.left, head, prev, tail);
  if (head === null) {
  	head = node;
    //console.log(head)
  }
  if (prev === null) {
  	prev = node;
    //console.log(prev)
  } else {
  	//console.log(node);
    //console.log(prev);
    node.left = prev;
    prev.right = node;
  }
  prev = node
  bstToLL(node.right, head, prev, tail);
  if(node.right === null) {
  	tail = node;
  }
  return head;
}

Node(bt.root);

代码有效,但我认为它没有得到正确的结果。二叉树看起来像 -

    4
   / \
  2   5
 / \
1   3

当我从bstToLL()方法返回头部时,我得到一个对象,其中val 4指向右子5并且离开子2,依此类推。

如果您运行代码,并检查调试器,您将看到头对象。

如果我以正确的方式做这件事,以及如何解决结果,有人可以指导我吗?

1 个答案:

答案 0 :(得分:2)

这是一些将二叉树转换为LinkedList的代码。它将按顺序记录12345

function TreeNode(left, value, right) {
  this.left = left;
  this.value = value;
  this.right = right;
}

function ListNode(prev, value, next) {
  this.prev = prev;
  this.value = value;
  this.next = next;
}

function LinkedList(head, tail) {
  if (tail === undefined) tail = head;
  this.head = head;
  this.tail = tail;
}
LinkedList.prototype.addToStart = function(list) {
  this.head.prev = list.tail;
  list.tail.next = this.head;
  this.head = list.head;
}
LinkedList.prototype.addToEnd = function(list) {
  this.tail.next = list.head;
  list.head.prev = this.tail;
  this.tail = list.tail;
};

function bstToLL(tree) {
  var centerNode = new ListNode(null, tree.value, null);
  var list = new LinkedList(centerNode);
  if (tree.left) list.addToStart(bstToLL(tree.left));
  if (tree.right) list.addToEnd(bstToLL(tree.right));
  return list;
}

var tree = new TreeNode(
  new TreeNode(
    new TreeNode(null, 1, null),
    2,
    new TreeNode(null, 3, null)
  ),
  4,
  new TreeNode(null, 5, null)
);
var linkedList = bstToLL(tree);
for (var node = linkedList.head; node; node = node.next) console.log(node.value);