Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.12.2016, 06:32
Новичок на форуме
Отправить личное сообщение для SergeyShatter Посмотреть профиль Найти все сообщения от SergeyShatter
 
Регистрация: 12.12.2016
Сообщений: 2

Описание интерфейса метода с использованием тест-файла Mocha
К сожалению я недостаточно хорошо понимаю ООП в JS и как следствие я застрял на написании очередного метода. Речь идет об алгоритме Max Heap. Ниже приведена лишь часть, которой достаточно для реализации метода. Суть задания: Дан набор методов. Необходимо реализовать их интерфейс используя код теста Mocha. В данный момент я застрял на методе swapWithParent(). Подскажите пожалуйста как его реализовать.
Заранее благодарю всех, кто примет участие!

Основной файл:

"use strict";

class Node {
	constructor(data, priority) {
		this.data = data;
		this.priority = priority;
		this.parent = null;
		this.left = null;
		this.right = null;
	}

	appendChild(node) {
        node.parent = this;

        if (this.left && this.right) {
            return;
        }

        if (this.left) {
            this.right = node;
            return;
        }

        this.left = node;
	}

	removeChild(node) {
        if (node == this.left) {
            this.left = null;
        } else if(node == this.right) {
            this.right = null;
        } else return error;

        node.parent = null;
	}

	remove() {
        if (!this.parent) {
            return;
        } else {
            this.parent.removeChild(this);
        }
	}

	swapWithParent() {
		if (!this.parent) {
            return;
        }
        
	}
}

module.exports = Node;


Описание работы метода swapWithParent() в тест файле Mocha:

describe('#swapWithParent', () => {
		it('does nothing if node does not have parent', () => {
			const node = new Node(15, 42);

			expect(() => {
				node.swapWithParent();
			}).not.to.throw();
		});

		it('updates parent.parent', () => {
			const parent = new Node(15, 42);
			const child = new Node(42, 15);

			parent.appendChild(child);
			child.swapWithParent();

			expect(parent.parent).to.equal(child);
		});

		it('updates parent.parent.parent', () => {
			const root = new Node(8, 8);
			const child = new Node(4, 4);
			const grandson = new Node(2, 2);

			root.appendChild(child);
			child.appendChild(grandson);

			grandson.swapWithParent();

			expect(child.parent).to.equal(grandson);
			expect(grandson.parent).to.equal(root);
		});

		it('updates child.parent', () => {
			const parentOfParent = new Node(100, 500);
			const parent = new Node(15, 42);
			const child = new Node(42, 15);

			parentOfParent.appendChild(parent);
			parent.appendChild(child);
			child.swapWithParent();

			expect(child.parent).to.equal(parentOfParent);
		});

		it('updates parent.child.parent', () => {
			const root = new Node(1, 2);
			const left = new Node(3, 4);
			const right = new Node(5, 6);

			root.appendChild(left);
			root.appendChild(right);

			right.swapWithParent();

			expect(left.parent).to.equal(right);
		})

		it('updates children of node and parent node', () => {
			const root = new Node(42, 15);
			const left = new Node(13, 42);
			const right = new Node(0, 1);
			const childOfLeft = new Node(0, 15);

			root.appendChild(left);
			root.appendChild(right);
			left.appendChild(childOfLeft);

			left.swapWithParent();

			expect(left.right).to.equal(right);
			expect(left.left).to.equal(root);
			expect(root.left).to.equal(childOfLeft);
		});

		it('maintains correct state of parent.parent.left and parent.parent.right', () => {
			const root = new Node(15, 42);
			const left = new Node(42, 15);
			const right = new Node(13, 42);
			const childOfLeft = new Node(13, 34);
			const childOfRight = new Node(0, 1);

			root.appendChild(left);
			root.appendChild(right);
			left.appendChild(childOfLeft);
			right.appendChild(childOfRight);

			childOfLeft.swapWithParent();
			childOfRight.swapWithParent();

			expect(root.left).to.equal(childOfLeft);
			expect(root.right).to.equal(childOfRight);
		});
	});

Последний раз редактировалось SergeyShatter, 12.12.2016 в 06:35. Причина: Неточность в заголовен
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2017, 02:56
Новичок на форуме
Отправить личное сообщение для sashaKazakevich Посмотреть профиль Найти все сообщения от sashaKazakevich
 
Регистрация: 24.01.2017
Сообщений: 2

Привет! я новичок и тоже решаю это задание.Вот моя реализация этого метода понимаю что она далека от идеала на зато есть почва для размышлений

swapWithParent() {
		if (!this.parent) return

		var thisChildLeft = this.left;
		var thisChildRight = this.right;
		var thisParent = this.parent;

		var parentChildRight = this.parent.right;
		var parentChildLeft = this.parent.left;
		var parentParent = this.parent.parent;

		if(parentParent){
			var parentParentLeft = this.parent.parent.left;
			var parentParentRight = this.parent.parent.right;
		}

		this.parent.parent = this;
		this.parent = parentParent;

		if (this === parentChildRight){
			if (parentChildLeft){
				this.left = parentChildLeft;
				parentChildLeft.parent = this;
			}

			this.right = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}

		if (this === parentChildLeft){
			if (parentChildRight){
				this.right = parentChildRight;
				parentChildRight.parent = this;
			}

			this.left = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}


		if (thisParent === parentParentLeft){
			this.parent.left = this;
		}

		if (thisParent === parentParentRight){
			this.parent.right = this;
		}
	}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выпадающее меню на JS (подкатегории) Trueplayer Events/DOM/Window 5 18.09.2014 22:29
Древовидное меню и селекторы youstm jQuery 6 15.09.2014 12:42
Загрузка файла с использованием drag and drop art_maestro Общие вопросы Javascript 2 01.08.2011 02:46